Rust 中源自 into_iter() 的克隆迭代器的成本?

yes*_*int 4 iterator clone rust

我试图弄清楚源自into_iter()Rust 的克隆迭代器的成本是多少,但找不到任何有意义的东西。

考虑这样的代码:

let v = vec![1,2,3,4,...]; // Some large vector
let iter = v.into_iter().map(...some closure...);
let another_iter = iter.clone(); // What is copied here??
Run Code Online (Sandbox Code Playgroud)

由于我已将向量移动到迭代器中,因此iter现在拥有带有向量值的内部缓冲区。这正是我想要实现的抽象容器类型的目的。

但是,当我打电话时会发生什么iter.clone()?它是否复制带有数据的整个内部缓冲区(可能非常昂贵),或者只是在引用同一缓冲区时复制迭代器状态(便宜)?

是否有一种惯用的方法来存储和廉价地克隆源自 的此类迭代器into_iter()

caf*_*e25 7

由于每个IntoIterator实现都可以定义它自己的type IntoIter: Iterator<Item = Self::Item>;答案,所以它完全取决于into_iter.

因为它正在克隆内部缓冲区,从它的实现std::vec::IntoIter可以看出:Clone

impl<T: Clone, A: Allocator + Clone> Clone for IntoIter<T, A> {
    #[cfg(not(test))]
    fn clone(&self) -> Self {
        self.as_slice().to_vec_in(self.alloc.deref().clone()).into_iter()
    }
    #[cfg(test)]
    fn clone(&self) -> Self {
        crate::slice::to_vec(self.as_slice(), self.alloc.deref().clone()).into_iter()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @yesint `vec.into_iter()` 将项从 vec 中移出,这会阻止从它们最初存储的位置进行访问。如果您想让多个迭代器共享相同的存储,请使用“vec.iter()”,它会返回引用。 (3认同)