2017-07-19 70 views
2

我想在矢量反覆幾次:克隆迭代器是否複製整個底層向量?

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-循環有錯誤「之後的舉動這裏使用的價值。」我知道我可以在兩個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?

迭代器一般是克隆,能夠在所有他們的「作品」是克隆能。

實際的堆分配數據是迭代器的「片」還是它指向堆數據的內存地址上述片?

回答

2

克隆切片迭代器(這是您在Vec或數組上調用iter()時獲得的迭代器的類型)不會複製基礎數據。兩個迭代器仍然指向存儲在原始向量中的數據,所以克隆操作便宜。

其他類型的可克隆迭代器可能也是如此。

在你的情況,而不是調用i_vec.iter(),然後克隆它,你也可以撥打i_vec.iter()多次:

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

可以得到相同的結果,但可能是更具可讀性。

+0

我想兩次使用i_vec.iter()不會遭受借用檢查器的憤怒,因爲我們沒有綁定i_vec的東西。 – Dragon

+0

@Dragon它的作品,因爲它每次只需要一個只讀的參考,它可以有多個。你原來的代碼的問題是'for my in_vector'消耗了vector(它用來將數據移出vector),所以你不能在這之後使用vector。 – interjay

+1

甚至更​​習慣(正如Clippy告訴你的)是'爲了我在&i_vec {for j in&i_vec {...}}'。 – Shepmaster