克隆迭代器会复制整个底层向量吗?

时间:2017-07-19 15:51:05

标签: memory iterator rust

我想多次迭代一个向量:

let my_vector = vec![1, 2, 3, 4, 5];
let mut out_vector = vec![];
for i in my_vector {
    for j in my_vector {
        out_vector.push(i * j + i + j);
    }
}

j-loop在移动后使用的值为#34;错误。我知道我可以在&之前放置一个my_vector并借用向量,但是有多种方法可以做到这一点很好。我也想了解一点。

或者,我可以写下以下内容:

let i_vec = vec![1, 2, 3, 4, 5, 6];
let iterator = i_vec.iter();
let mut out_vec = vec![];
for i in iterator.clone() {
    for j in iterator.clone() {
        out_vec.push(i * j + i + j);
    }
}

我看了What's the most efficient way to reuse an iterator in Rust?

  

如果他们所有的"部分"一般的迭代器都是可克隆的。是可以克隆的。

实际堆分配的数据是" piece"迭代器或是指向堆数据的内存地址上述部分?

1 个答案:

答案 0 :(得分:3)

克隆切片迭代器(这是在iter()或数组上调用Vec时获得的迭代器类型)不会复制基础数据。两个迭代器仍然指向存储在原始向量中的数据,因此克隆操作很便宜。

对于其他类型的可克隆迭代器,情况也是如此。

在您的情况下,您可以多次拨打i_vec.iter(),而不是拨打i_vec.iter()然后再克隆它:

for i in i_vec.iter() {
    for j in i_vec.iter() {

给出了相同的结果,但可能更具可读性。