我想知道从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()的迭代器?

推荐答案

因 for each IntoIterator实现都可以定义自己的type IntoIter: Iterator<Item = Self::Item>;,所以答案是它完全取决于into_iter产生的迭代器.

对于std::vec::IntoIter,它正在克隆内部缓冲区,这可以从Clone implementation of it:

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()
    }
}

Rust相关问答推荐

通用池类型xsx

无需通过ASIO输入音频,并使用cpal进行反馈示例

交叉术语未正确清除屏幕

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

文档示例需要导入相关的 struct ,但仅在运行测试时.这是故意的行为吗?

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

为什么Rust函数的移植速度比C++慢2倍?

在Rust中宏的表达式中提取对象

重写Rust中的方法以使用`&;mut self`而不是`mut self`

定义只有一些字段可以缺省的 struct

在Rust中声明和定义一个 struct 体有什么区别

如何迭代属性以判断相等性?

Rust 中什么时候可以返回函数生成的字符串切片&str?

实现 Deref 的 struct 可以返回对外部数据的引用吗?

仅发布工作区的二进制 crate

Google chrome 和 Apple M1 中的计算着色器

使用 serde_json 进一步处理字段

Rustfmt 是否有明确类型的选项?

使用 rust-sqlx/tokio 时如何取消长时间运行的查询

类型参数不受 impl 特征、自身类型或谓词的约束