我正在试图弄清楚在Rust中从
考虑以下代码:
into_iter()
产生的迭代器的克隆成本是多少,但是找不到任何有意义的信息。考虑以下代码:
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??
自从我将向量转换为迭代器后,iter
现在拥有包含向量值的内部缓冲区。这正是我想要实现的,以抽象容器类型。
然而,当我调用iter.clone()
时会发生什么?它会复制整个包含数据的内部缓冲区(可能非常昂贵),还是只复制迭代器状态并引用相同的缓冲区(廉价)?
有没有一种惯用的方法来存储并廉价地克隆由into_iter()
生成的这种迭代器?
vec.into_iter()
从vec中将项目移出,这样就无法从原始存储位置访问它们。如果您希望多个迭代器共享相同的存储空间,请使用vec.iter()
,它返回引用。 - undefinedvec::IntoIter
并没有什么是固定不变的,它拥有这些项,这意味着它可以随意处理它们。此外,要从中获取项,它必须是可变的,并且它也会返回拥有的项。请记住,即使原始绑定是不可变的,您始终可以使用let mut x = x;
来使拥有的项可变。 - undefined