Memory 克隆迭代器会复制整个基础向量吗?

Memory 克隆迭代器会复制整个基础向量吗?,memory,iterator,rust,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循环有一个“移动后此处使用的值”错误。我知道我可以把一个&放在两个我的_向量之前,然后借用向量,但是有不止一种方法做事情是很好的。我也想了解一下 或者,

我想在向量上迭代几次:

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循环有一个“移动后此处使用的值”错误。我知道我可以把一个
&
放在两个
我的_向量
之前,然后借用向量,但是有不止一种方法做事情是很好的。我也想了解一下

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

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);
    }
}
我看了看:

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

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

克隆切片迭代器(这是在
Vec
或数组上调用
iter()
时得到的迭代器类型)不会复制底层数据。这两个迭代器仍然指向存储在原始向量中的数据,因此克隆操作成本较低

对于其他类型上的可克隆迭代器也可能如此

在您的情况下,您可以多次调用
i_vec.iter()
,而不是调用
i_vec.iter()

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

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

我想两次使用I_vec.iter()不会引起借用检查器的愤怒,因为我们没有将I_vec绑定到某个对象。@Dragon它之所以有效,是因为它每次都使用只读引用,并且可以有多个引用。原始代码的问题是
for i in my_vector
消耗向量(用于将数据移出向量),因此之后不能使用向量。更惯用的用法(正如Clippy告诉你的)是
for i in&i_vec{for j in&i_vec{…}
@Shepmaster:没错,但是问题已经提到了这个方法,所以我在回答中没有提到。