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

Dra*_*gon 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

j 循环存在“移动后此处使用的值”错误。我知道我可以&在两个my_vectors 之前放置一个并借用向量,但是有不止一种方法来做事情是很好的。我也想要一点见解。

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我查看了在 Rust 中重用迭代器的最有效方法是什么?

如果迭代器的所有“部分”都是可克隆的,那么迭代器通常是可克隆的。

实际的堆分配数据是迭代器的“片段”还是指向上述片段的堆数据的内存地址?

int*_*jay 7

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

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

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

for i in i_vec.iter() {
    for j in i_vec.iter() {
Run Code Online (Sandbox Code Playgroud)

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