当前位置: 首页 > news >正文

2024 Rust现代实用教程Iterator迭代器

文章目录

  • 一、迭代与循环
    • 1.循环
    • 2.迭代iteration
    • 3.区别
  • 二、Intoiterator、Iterator和Iter之间的关系
    • 1.Intolterator
    • 2.Iterator Trait
    • 3. 源码中经常出现的iter
  • 三、获取迭代器的三种方法iter(),iter_mut()和into_iter()
    • 1.iter()方法
    • 2.iter_mut()方法
    • 3.into_iter()方法---尽量写
  • 四、自定义类型实现iter(),iter_mut()和into_iter()
  • 参考

一、迭代与循环

1.循环

定义:循环是一种控制流结构,它会反复执行一组语句,直到满足某个条件。
控制条件:循环通常包含一个条件表达式,只有在条件为真时,循环体中的语句才会执行。
退出条件:循环执行直到条件不再满足,或者通过break、语句显式中断循环。
使用场景:适用于需要反复执行某个操作直到满足某个条件的情况。

2.迭代iteration

·定义:选代是对序列中的元素进行逐个访问的过程。
·控制条件:迭代通常使用迭代器(lterator)来实现,迭代器提供了对序列元素的访问和操作。
·退出条件:通常不需要显式的退出条件,迭代器会在处理完所有元素后自动停止。
·使用场景:适用于需要遍历数据结构中的元素的情况,例如数组、切片、集合等。

3.区别

·1.循环是一种控制流结构,它反复执行一组语句。
·2.送代是对序列中的元素进行逐个访问的过程,通常使用迭代器实现。
·3.循环可以是有限的(通过设置退出条件)或无限的(使用loop)关键字)。
·4.迭代器提供了一种更抽象的方式来处理序列,使得代码更具可读性和灵活性。
在Rust中,循环和迭代性能的差距可能会取决于具体的使用情况和编译器的优化。绝大多数情况下,Rust的迭代器是经过优化的,可以达到或接近手动编写循环的性能水平。

// &[i32] &Vec
// loop
fn sum_with_loop(arr: &[i32]) -> i32 {let mut sum = 0;for &item in arr {sum += item;}sum
}// iter
fn sum_with_iter(arr: &[i32]) -> i32 {arr.iter().sum()
}fn main() {const ARRAY_SIZE: usize = 10000;let array: Vec<i32> = (1..=ARRAY_SIZE as i32).collect();let sum1 = sum_with_loop(&array);println!("sum loop {}", sum1);let sum2 = sum_with_iter(&array);println!("sum loop {}", sum2);
}

编译及运行:

▶ cargo runCompiling ch5_iter_loop v0.1.0 (/home/wangji/code/rust/2024_rust/rust_project/ch4_iter_loop)Finished `dev` profile [unoptimized + debuginfo] target(s) in 19.20sRunning `target/debug/ch5_iter_loop`
sum loop 50005000
sum loop 50005000

二、Intoiterator、Iterator和Iter之间的关系

1.Intolterator

Intolterator是一个RustTrait,它定义了一种将类型转换为迭代器的能力。
该Trait包含一个方法into_iter,该方法返回一个实现了IteratorTrait的迭代器。

通常,当你有一个类型,希望能够对其进行迭代时,你会实现IntolteratorTrait来提供将该类型转换为迭代器的方法。

2.Iterator Trait

Iterator是Rust标准库中的Trait,定义了一种访问序列元素的方式。
·它包含了一系列方法,如next、map、filter、sum、等,用于对序列进行不同类型的操作。

·通过实现Iterator丶Trait,你可以创建自定义的迭代器,以定义如何迭代你的类型中的元素。

pub trait Iterator{
type Item;
fn next(&mut self) -> Option<Self::Item>;
}

3. 源码中经常出现的iter

·Iter是IteratorTrait的一个具体实现,通常用于对集合中的元素进行迭代。
·在Rust中,你会经常看到Iter,特别是在对数组、切片等集合类型进行迭代时。
·通过lntolteratorTrait,你可以获取到一个特定类型的迭代器,比如Iter,然后可以使用IteratorTrait的方法进行操作。

fn main() {// veclet v = vec![1, 2, 3, 4, 5]; // intoIterator 特质 into_iter// 转换为迭代器let iter = v.into_iter(); // move 所有权转移 类似ppt中的Iter Iterator的特质对象let sum: i32 = iter.sum();println!("sum: {}", sum);// println!("{:?}", v)// arraylet array = [1, 2, 3, 4, 5];let iter: std::slice::Iter<'_, i32> = array.iter();//所有权没有转移let sum: i32 = iter.sum();println!("sum: {}", sum);println!("{:?}", array);// charslet text = "hello, world!";let iter = text.chars();//所有权没有转移// 等价于let uppercase:String = iter.map(|c| c.to_ascii_uppercase()).collect();// collect表示迭代器的下一个, <String>表示返回的类型是Stringlet uppercase = iter.map(|c| c.to_ascii_uppercase()).collect::<String>();println!("uppercase: {}", uppercase);println!("{:?}", text);
}

编译及运行

▶ cargo runCompiling ch2_intoiterator_iterator_iter v0.1.0 (/home/wangji/code/rust/2024_rust/rust_project/ch5_intoiterator_iterator_iter)Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.04sRunning `target/debug/ch2_intoiterator_iterator_iter`
sum: 15
sum: 15
[1, 2, 3, 4, 5]
uppercase: HELLO, WORLD!
"hello, world!"

三、获取迭代器的三种方法iter(),iter_mut()和into_iter()

1.iter()方法

iter()方法返回一个不可变引用的迭代器,用于只读访问集合的元素。
该方法适用于你希望在不修改集合的情况下迭代元素的场景。

2.iter_mut()方法

iter_mut()方法返回一个可变引用的迭代器,用于允许修改集合中的元素。
该方法适用于你希望在迭代过程中修改集合元素的场景。

3.into_iter()方法—尽量写

into_iter()方法返回一个拥有所有权的迭代器,该迭代器会消耗集合本身,将所有权转移到迭代器。

该方法适用于你希望在迭代过程中拥有集合的所有权,以便进行消耗性的操作,如移除元素。

fn main() {let vec = vec![1, 2, 3, 4, 5];// iter()for &item in vec.iter() {println!("{}", item);}println!("{:?}", vec);// 可变引用let mut vec = vec![1, 2, 3, 4, 5];for item in vec.iter_mut() {*item *= 2;}// 所有权转移println!("{:?}", vec);let vec = vec![1, 2, 3, 4, 5];for item in vec.into_iter() {println!("{}", item);}// println!("{:?}", vec);
}

编译加运行

▶ cargo runCompiling ch3_iter v0.1.0 (/home/wangji/code/rust/2024_rust/rust_project/ch6_iter)Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.14sRunning `target/debug/ch3_iter`
1
2
3
4
5
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]
1
2
3
4
5

四、自定义类型实现iter(),iter_mut()和into_iter()

#[derive(Debug)]
struct Stack<T> {items: Vec<T>,
}impl<T> Stack<T> {fn new() -> Self {Stack { items: Vec::new() }}// 入栈fn push(&mut self, item: T) {self.items.push(item);}// 出栈fn pop(&mut self) -> Option<T> {self.items.pop()}// 不可变引用fn iter(&self) -> std::slice::Iter<T> {self.items.iter()}// 返回可变引用fn iter_mut(&mut self) -> std::slice::IterMut<T> {self.items.iter_mut()}// 所有权转移!!fn into_iter(self) -> std::vec::IntoIter<T> {self.items.into_iter()}
}fn main() {let mut my_stack = Stack::new();my_stack.push(1);my_stack.push(2);my_stack.push(3);for item in my_stack.iter() {println!("Item {}", item);}println!("{:?}", my_stack);for item in my_stack.iter_mut() {*item *= 2;}println!("{:?}", my_stack);for item in my_stack.into_iter() {println!("{}", item);}// println!("{:?}", my_stack);
}

编译及运行

 cargo runCompiling ch28_custom_iter v0.1.0 (/home/wangji/installer/rust/project/ch28_custom_iter)
warning: method `pop` is never used--> src/main.rs:15:8|
6  | impl<T> Stack<T> {| ---------------- method in this implementation
...
15 |     fn pop(&mut self) -> Option<T> {|        ^^^|= note: `#[warn(dead_code)]` on by defaultwarning: `ch28_custom_iter` (bin "ch28_custom_iter") generated 1 warningFinished `dev` profile [unoptimized + debuginfo] target(s) in 12.50sRunning `target/debug/ch28_custom_iter`
Item 1
Item 2
Item 3
Stack { items: [1, 2, 3] }
Stack { items: [2, 4, 6] }
2
4
6

参考

  • 2024 Rust现代实用教程

相关文章:

2024 Rust现代实用教程Iterator迭代器

文章目录 一、迭代与循环1.循环2.迭代iteration3.区别 二、Intoiterator、Iterator和Iter之间的关系1.Intolterator2.Iterator Trait3. 源码中经常出现的iter 三、获取迭代器的三种方法iter(),iter_mut()和into_iter()1.iter()方法2.iter_mut()方法3.into_iter()方法---尽量写 …...

基于SpringBoot司机信用评价的货运管理系统【附源码】

基于SpringBoot司机信用评价的货运管理系统 效果如下&#xff1a; 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展&#xff0c;货运管理系统的效率与安全性日益受到重视。在货运过程中&am…...

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…...

数据库条件查询排查——引号故障

一、错误代码 $where_查询职汇总员[$value头[EmpCode]]$value职员[EmpCode]; 二、正常写法 $where_查询职汇总员[EmpCode]$value职员[EmpCode]; 三、原因 前一个是变量嵌套&#xff0c;这里不需要嵌套...

Python爬虫:揭开淘宝商品描述的神秘面纱

在这个信息爆炸的时代&#xff0c;我们每天都在和时间赛跑。作为一名Python开发者&#xff0c;你是否曾梦想拥有超能力&#xff0c;能够瞬间揭开淘宝商品描述的神秘面纱&#xff1f;今天&#xff0c;就让我们一起化身为代码界的“福尔摩斯”&#xff0c;使用Python爬虫技术&…...

动态规划— 一和零

class Solution {public int findMaxForm(String[] strs, int m, int n) {int[][] dp new int[m1][n1];//dp[i][j]表示i个0和j个1时的最大子集int oneNum 0, zeroNum 0;for(String str : strs){oneNum 0;zeroNum 0;for(char c : str.toCharArray()){if(c 0){zeroNum;}els…...

【Android】SharedPreferences存储中没有 Double 类型数据存储的解决方式

项目需求 存储定位数据&#xff0c;需要保存到小数点后10位数据。 需求分析 项目需求看起来很简单&#xff0c;其实实现起来也不难&#xff0c;我们直接使用SharedPreferences 存储一下就好了&#xff0c;反正也没其他要求。 好了&#xff0c;直接使用SharedPreferences 存…...

ffmpeg:视频字幕嵌入(GPU加速)

实现方案 参考指令 ffmpeg -i input_video.mp4 -vf "subtitlessubtitles.srt" output_video.mp4 解决因文件名称复杂导致的指令执行失败问题&#xff08;引号给文件框起来&#xff09; ffmpeg -i "A.mp4" -vf "subtitlesB.srt" "c.mp4&qu…...

DCN网络进行新冠肺炎影像分类

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现mnist手写数字识别】…...

C++中的继承——第二篇

一、继承与友元 友元关系不能够继承&#xff08;就像父亲的朋友不一定是自己的朋友&#xff09; 具体实现起来就是父类的友元可以访问父类的成员&#xff0c;但是不可以访问子类的成员 二、继承与静态成员 子类的静态成员变量本质上与父类的是同一份&#xff0c;存储在静态…...

动态规划探索篇

Leetcode63——不同路径Ⅱ 题目描述&#xff1a; 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。 网格…...

js中多let与var

在 JavaScript 中&#xff0c;let 和 var 都用于声明变量&#xff0c;但它们有一些关键的区别。主要区别包括作用域、变量提升、可重复声明、以及在全局作用域中的行为。 1. 作用域&#xff08;Scope&#xff09; let&#xff1a;块级作用域。用 let 声明的变量只在其所在的代…...

基于人工智能的搜索和推荐系统

互联网上的搜索历史分析和用户活动是个性化推荐的基础&#xff0c;这些推荐已成为电子商务行业和在线业务的强大营销工具。随着人工智能的使用&#xff0c;在线搜索也在改进&#xff0c;因为它会根据用户的视觉偏好提出建议&#xff0c;而不是根据每个客户的需求和偏好量身定制…...

冷钱包与热钱包的差异 | 加密货币存储的安全方案

随着加密货币的普及&#xff0c;越来越多的人开始重视加密资产的安全存储问题。钱包作为存储数字资产的工具&#xff0c;主要分为冷钱包和热钱包两大类。它们在安全性、便捷性以及适用场景方面各有优劣。了解这两者的差异&#xff0c;有助于投资者根据自己的需求选择合适的钱包…...

014:无人机遥控器操作

摘要&#xff1a;本文详细介绍了无人机遥控器及其相关操作。首先&#xff0c;解释了油门、升降舵、方向舵和副翼的概念、功能及操作方式&#xff0c;这些是控制无人机飞行姿态的关键部件。其次&#xff0c;介绍了美国手、日本手和中国手三种不同的操作模式&#xff0c;阐述了遥…...

PCL 点云高度归一化

目录 一、概述二、代码示例三、结果一、概述 点云高度归一化:为了消除地形起伏对点云数据高程值的影响,特别是在地物间存在显著高程差异的情况下,必须对点云数据进行归一化处理。这一步骤对于许多算法至关重要,因为它能够显著提升后续点云处理或分割任务的准确性。 归一化处…...

【Effective C++】阅读笔记4

1. 确保公有继承中有is-a的关系 Is-a关系理解 该关系就是派生类应该具备基类的所有特性&#xff0c;并且可以替代基类对象使用&#xff0c;例如猫和狗都是动物的派生类&#xff0c;因为猫和狗都和动物形成了is-a关系&#xff0c;猫和狗都是动物。 在该关系下&#xff0c;派生类…...

浅谈mysql【8.0】链接字符串

string connectionString "serveryour_server;useryour_user;passwordyour_password;databaseyour_database;sslmodenone;allowPublicKeyRetrievaltrue;Allow User VariablesTrue;";在 C# 中配置 MySQL 数据库连接字符串时&#xff0c;可以通过添加多个参数来控制连…...

BERT,RoBERTa,Ernie的理解

BERT&#xff1a; 全称&#xff1a;Bidirectional Encoder Representations from Transformers。可以理解为 “基于 Transformer 的双向编码器表示”。含义&#xff1a;是一种用于语言表征的预训练模型。它改变了以往传统单向语言模型预训练的方式&#xff0c;能够联合左侧和右…...

获取 Wind 数据并进行简单的择时分析

使用Python获取Wind数据并进行简单的择时分析时&#xff0c;需要按照以下步骤操作。 &#xff08;1&#xff09;登录Wind官网&#xff0c;在“金融解决方案”的下拉列表里选择“金融终端”选项&#xff0c;如下图3.2所示。 &#xff08;2&#xff09;根据自己计算机的实际情况…...

OpenClaw龙虾推出官方中国镜像站,由字节跳动提供支持

文章目录前言龙虾是谁&#xff1f;为啥它搞个镜像站这么重要&#xff1f;中国镜像站来了&#xff1a;地址是 mirror-cn.clawhub.com背后的故事&#xff1a;腾讯、字节、龙虾的"三国演义"镜像站的意义&#xff1a;不只是个"加速器"怎么用&#xff1f;手把手…...

Wan2.2-I2V-A14B部署教程:适配CUDA 12.4与驱动550.90.07的关键步骤

Wan2.2-I2V-A14B部署教程&#xff1a;适配CUDA 12.4与驱动550.90.07的关键步骤 1. 镜像概述与核心特性 Wan2.2-I2V-A14B是一款专为文生视频任务优化的私有部署镜像&#xff0c;针对RTX 4090D 24GB显存显卡和CUDA 12.4环境进行了深度适配。这个镜像最大的特点是开箱即用&#…...

颠覆式项目管理工具GanttProject:让团队协作效率提升300%的开源解决方案

颠覆式项目管理工具GanttProject&#xff1a;让团队协作效率提升300%的开源解决方案 【免费下载链接】ganttproject Official GanttProject repository 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject GanttProject是一款完全免费的开源甘特图工具&#xff…...

点云特征提取入门:5分钟搞懂Voxel-based和Pillar-based的核心区别

点云特征提取入门&#xff1a;5分钟搞懂Voxel-based和Pillar-based的核心区别 想象一下&#xff0c;当你站在城市的高楼俯瞰街道&#xff0c;看到的车辆和行人就像散落在空间中的点。这些点如何被计算机"理解"&#xff1f;这就是点云特征提取要解决的问题。Voxel-bas…...

VisualCppRedist AIO:解决Windows运行库管理难题的一站式方案

VisualCppRedist AIO&#xff1a;解决Windows运行库管理难题的一站式方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 一、直面运行库困境&#xff1a;三大场…...

开源硬件监控新选择:LibreHardwareMonitor全方位解析与应用指南

开源硬件监控新选择&#xff1a;LibreHardwareMonitor全方位解析与应用指南 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer. 项…...

XInput1_4.dll缺失怎么修复?2026年最新官方安全修复指南

XInput1_4.dll缺失怎么修复&#xff1f;2026年最新官方安全修复指南当你满心欢喜地连接好Xbox手柄&#xff0c;准备沉浸到最新游戏的紧张对决中&#xff0c;屏幕上却突然弹出“找不到XInput1_4.dll”或“XInput1_4.dll丢失”的错误提示&#xff0c;这确实让人瞬间扫兴。这个报错…...

MT管理器安卓版,APK逆向修改神器,APP提取APK教程。

今天算是比较郁闷的一天&#xff0c;作为互联网上算是最老的一批写用户&#xff0c;如果你是带人学习互联网的大佬&#xff0c;估计你都会放弃我这种年龄段的人&#xff0c;不过我还是活下来了&#xff0c;像我们这样的80、90后还有一大批活下来了。 AI出来了给人的引影响很大…...

国内开发者如何高效集成Nano Banana Pro与Sora2?——API中转站选型与实战避坑指南

1. 为什么需要API中转站&#xff1f; 对于国内开发者来说&#xff0c;想要直接调用Nano Banana Pro和Sora2的官方API&#xff0c;面临着几个现实问题。首先是网络访问的稳定性&#xff0c;Google和OpenAI的API服务器都部署在海外&#xff0c;国内直连经常会出现高延迟、丢包甚至…...

深度解析DeepMIMO:毫米波大规模MIMO信道建模的5个架构设计决策

深度解析DeepMIMO&#xff1a;毫米波大规模MIMO信道建模的5个架构设计决策 【免费下载链接】DeepMIMO-matlab DeepMIMO dataset and codes for mmWave and massive MIMO applications 项目地址: https://gitcode.com/gh_mirrors/de/DeepMIMO-matlab 在5G/6G通信系统演进…...