首页 > 其他分享 >Rust中的iter(), into_iter(), iter_mut()

Rust中的iter(), into_iter(), iter_mut()

时间:2024-05-27 15:21:55浏览次数:16  
标签:mut 迭代 into 元素 iter next

在Rust中,iter(), into_iter(), iter_mut()都是用于在集合类型上创建迭代器的方法。这三个方法各有不同,下面一一进行介绍。

iter(): iter() 方法创建一个不可变的引用迭代器。当你只想读取集合中的元素,而不想改变它们或消耗集合时,应使用 iter()。iter() 返回的迭代器将生成集合中每个元素的不可变引用。

let v = vec![1, 2, 3];
for i in v.iter() {
println!("{}", i);
}
在上面的代码中,i 的类型是 &i32,它是对元素的引用,我们不能修改这些元素。

into_iter(): into_iter() 方法创建一个消耗集合的迭代器。into_iter() 会获取集合的所有权并返回集合中每个元素的所有权。在你想要转移集合中元素所有权时,应使用 into_iter()。

let v = vec![1, 2, 3];
for i in v.into_iter() {
println!("{}", i);
}
在这个例子中,i 的类型是 i32。into_iter() 消耗了 v,这意味着 v 在此后不能再被使用。

iter_mut(): iter_mut() 创建一个可变引用迭代器。当你想要修改集合中的元素时,应使用 iter_mut()。iter_mut() 返回的迭代器将生成集合中每个元素的可变引用。

let mut v = vec![1, 2, 3];
for i in v.iter_mut() {
*i += 1;
}
在这个例子中,i 的类型是 &mut i32,我们可以修改 v 中的元素。

总结:iter() 返回不可变引用,into_iter() 获取元素的所有权并消耗集合,iter_mut() 返回可变引用。选择哪一个取决于你是否需要修改元素或是否需要元素的所有权。

into_iter() 方法
在Rust中,into_iter 是一个方法,其功能是将一个集合转换成一个迭代器。这个迭代器可以逐个访问集合中的元素,使我们能够遍历集合。

不同于 iter() 和 iter_mut(),into_iter() 方法会消耗(take ownership of)原集合,这意味着集合在 into_iter() 调用之后将无法再次使用。这是因为 into_iter() 产生的迭代器每次迭代都会"移出"一个元素,直到集合为空。

以下是一个 into_iter() 的示例:

let vec = vec![1, 2, 3];
let mut iter = vec.into_iter();
assert_eq!(Some(1), iter.next());
assert_eq!(Some(2), iter.next());
assert_eq!(Some(3), iter.next());
assert_eq!(None, iter.next());

在这个例子中,我们创建了一个包含三个元素的向量,并通过调用 into_iter() 将其转换为一个迭代器。然后,我们通过反复调用 next() 来逐个获取元素。当所有元素都被取出后,next() 返回 None,表示没有更多的元素。

再次提醒,由于 into_iter() 会消耗原集合,所以在 into_iter() 调用之后,原向量 vec 就无法再次使用了。这就是所谓的"消耗性"迭代。

iter.next() 方法
在 Rust 中,iter.next() 是迭代器接口中的方法,用于获取序列中的下一个元素。next 方法的返回类型通常是 Option<T>,其中 T 是你正在迭代的集合中元素的类型。

当还有可用元素时,next 方法会返回 Some(element),这里的 element 是序列中的下一个元素。当所有元素都已经被迭代完,next 方法会返回 None,表示没有更多的元素可以迭代。

所以,iter.next() 返回 Some(1) 表示迭代器的下一个元素是 1。当你看到 assert_eq!(Some(1), iter.next()); 这样的代码时,它的意思是,我们期望迭代器的下一个元素是 1。如果不是,那么这个断言就会失败,程序就会停止执行。

请注意,迭代器会在每次调用 next 方法时消耗一个元素。这意味着如果你再次调用 next,你会得到序列中的下一个元素,或者如果没有更多元素,就会得到 None。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_43844521/article/details/131886219

标签:mut,迭代,into,元素,iter,next
From: https://www.cnblogs.com/rincloud/p/18215601

相关文章

  • 【设计模式】迭代器模式 ——详解Iterator、foreach与for循环的区别
    参考:B站UP主动力节点迭代器模式定义:提供方法,顺序访问集合对象中的各个元素,而又不暴露对象的内部表示。为遍历不同的集合结构提供统一的接口,分离了集合对象的遍历行为。tips:Iterator迭代器本身就是JDK按照该模式设计的迭代器,通常情况下,我们都是直接使用JDK提供的。此处......
  • CF1089I Interval-Free Permutations
    标签:析合树析合树就是用来处理这一种值域连续段的问题的。OI-wiki上对于析合树的讲解。我们回顾一下题目,要求不存在长度为\([2,n-1]\)之间的连续段,换句话说,就是根节点下恰有\(n-1\)个节点,且没有任何一个字段是题目中要求的连续段。我们记这样的答案为\(A_n\)也就......
  • UVA11922 Permutation Transformer 题解
    题目传送门前置知识无旋treap解法与luoguP3391【模板】文艺平衡树不同的是本题翻转后需要放到整个序列的末尾。由于需要翻转后放到末尾,故无旋Treap在维护文艺平衡树的过程中合并时跳着合并即可。代码#include<bits/stdc++.h>usingnamespacestd;#definelllong......
  • 工业组态软件Intouch(单机版)入门{第二篇}
    Intouch激活授权步骤(以2014r2sp1版本(硬件狗+lic文件)和2017u3版本(XML文件)为例)Intouch授权一共分为两种。1、老版本配合硬件加密狗的授权方式。2、2017版本开始的XML文件授权方式。1、2017版之前硬件加密狗授权的方式。*第1步:*安装好软件之后,找到一个叫ArchestrALicenseM......
  • 工业组态软件Intouch(单机版)入门{第一篇}
    什么是Intouch?通俗来讲Intouch就是一个能将PLC里的信号显示在画面上的软件。当然它的具体实现要复杂一些,大概流程如下图:开发出来的项目大概如下图:一套Intouch软件包含哪些东西?常用的就是以下几个软件:***Intouch:***是一个项目管理器,是对项目所有操作的入口,新建项目......
  • Iterater迭代器和增强for循环
    1、Collection接口遍历元素—Iterator迭代器看一下下面这张图片:可以看出Collection接口有一个父接口Iterable,Iterable接口有一个iterator()方法,iterator()方法的类型是Iterator迭代器,实际上当我们使用方法时,返回的是一个Iterator对象,目的是实现元素的遍历。Iterator接口介......
  • CF1909I Short Permutation Problem 题解
    这是一道*1900的黑。考虑枚举\(m\),将\(<\fracm2\)和\(\ge\fracm2\)的数分开讨论。考虑相邻两个数\(a,b\(a>b)\)分别在\(\fracm2\)的两侧,则有\(b\gem-a\)。考虑将所有数按某种方法从小到大排序,以\(\min(x,m-x)\)为第一关键字,\(-x\)为第二关键字,则排列中......
  • C++ 的 mutable 引出的一系列思考
    阅读多线程实战第六章第二节时,看到mutable关键词的使用,突然忘记它的含义=>  https://github.com/xiaoweiChen/CPP-Concurrency-In-Action-2ed-2019/blob/master/content/chapter6/6.2-chinese.md 进而引申到mutable的使用=> C++的mutable关键字......
  • [ES2024] Simplify array immutable changes with the new array.with method
    Thenew Array.with methodgivesyouanimmutablesyntaxforchangingvaluesofanarrayataspecifiedindex.Sometimes .map willbemoreefficient.So,inthislessonwe'llcomparebothmethodswhilereplacinganobjectataspecificindex. varto......
  • Python学习迭代器(Iterator)
    一、可迭代的对象(Iterable)1、定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器),和带yield的函数,这些直接可以用在循环的对象统称为可迭代对象(Iterable)fromcollectionsimportIterableprint(isinstance([],Iterable))print(isin......