在Rust中,矢量是迭代器吗?

Ral*_*veo 13 iterator rust

是否准确地说明一个向量(以及其他集合类型)是一个Iterator

例如,我可以通过以下方式循环遍历向量,因为它实现了Iterator特征(据我所知):

let v = vec![1, 2, 3, 4, 5];

for x in &v {
    println!("{}", x);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想使用属于Iterator特征的函数(例如fold,mapfilter),为什么我必须首先调用iter()该向量?

我的另一个想法是,可能会将矢量转换为a Iterator,在这种情况下,上面的语法更有意义.

sta*_*lue 31

不,矢量不是迭代器.

但是它实现了trait IntoIterator,for循环使用它来将向量转换为所需的迭代器.

文档中,Vec您可以看到它IntoIterator以三种方式实现:for Vec<T>,移动,迭代器返回类型的项T,用于共享引用&Vec<T>,迭代器返回共享引用&T,以及&mut Vec<T>返回可变引用的位置.

iter()仅仅是一个方法在Vec转换Vec<T>直接进入返回共享引用一个迭代,而不首先将其转化为参考.有一种iter_mut()生成可变引用的兄弟方法.

  • 这取决于您在做什么,以及循环后是否仍然需要“vec”。使用“for foo in vec”,向量的每个元素都被移动到“foo”中,循环中的代码可以将其移动到其他地方,即重用它而不克隆它,所以如果元素很大,效率会更高。编写的内容也较少,因此您始终可以先尝试“for foo in vec”,如果不行,借用检查器会提醒您。 (5认同)
  • 那么,调用 `for foo in vec` 与 `for foo in vec.into_iter()` 是同义的吗?`for foo in &amp;vec` 与 `for foo in vec.iter()` 相同,并且 `for foo in &amp;mut vec` 与 `for foo in vec.iter_mut()` 相同? (4认同)
  • 是否有理由更喜欢执行 `for foo in vec` 而不是 `for foo in vec.iter()`? (3认同)