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()?
由于每个IntoIterator实现都可以定义它自己的type IntoIter: Iterator<Item = Self::Item>;答案,所以它完全取决于into_iter.
因为它正在克隆内部缓冲区,从它的实现std::vec::IntoIter可以看出:Clone
Run Code Online (Sandbox Code Playgroud)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() } }