簡體   English   中英

如何將相同的 integer 添加到 Rust 中向量的每個元素?

[英]How do I add the same integer to each element of a vector in Rust?

在 Python 中,如果我有一個列表並想為每個元素添加 10,我會這樣做:

bar = [2,4,5,6,7]
bar = [x + 10 for x in bar]

導致: [12,14,15,16,17] 如何在 Rust 中做到這一點? 是做一個for循環並遍歷每個向量元素的唯一方法嗎?

執行此操作的 Rust 方法與 Python 非常相似:使用迭代器! 粗略相當於 Python 的列表理解是iter::map來獲取新元素, iter::collect來收集到一個新的向量(或其他類型的集合)。

例如,如果barVec<i32> (或任何其他原始 integer 類型)並且您想為每個元素添加 10,請嘗試

bar = bar.into_iter().map(|x| x + 10).collect();

(操場)

或者,您可以使用

bar.iter_mut().for_each(|x| *x += 10);

(操場)

這基本上就像一個 for 循環,但更簡潔一些。 這通常比第一種方法更有效,因為您不需要分配新向量(足夠智能的編譯器可能能夠避免這種情況)。 唯一的缺點是這個版本不太靈活。 output 仍然需要是一個向量; 你不能切換到 hash 設置或你有什么。 您也無法保留舊向量的副本。 請參閱下面的一些可能的示例。

fn main() {
    let mut bar = vec![2, 4, 5, 6, 7];
    // Overwrite the old vector
    bar = bar.into_iter().map(|x| x + 10).collect();
    println!("new bar: {:?}", bar);

    let bar = vec![2, 4, 5, 6, 7];
    // Make a completely new vector
    // Note that this works only because i32 implements the Copy trait,
    // so we can make copies of the elements of bar without any problems
    // In more general situations, we may need to clone each element
    let foo: Vec<_> = bar.iter().map(|&x| x + 10).collect();
    println!("old bar: {:?} (it's still around)", bar);
    println!("new foo: {:?}", foo);

    use std::collections::HashSet;
    let bar = vec![2, 4, 5, 6, 7];
    // transform the data and collect it into a HashSet
    // instead of a vector
    let bar: HashSet<_> = bar.into_iter().map(|x| x + 10).collect();
    println!("new bar: {:?} (note that now bar is unordered)", bar);

    let mut bar = vec![2, 4, 5, 6, 7];
    // Overwrite the old vector in place
    bar.iter_mut().for_each(|x| *x += 10);
    println!("new bar: {:?}", bar);
}

(操場)

這是基本代碼,說明了如何按照問題默認的方式進行操作。 它可能對像我這樣的 Rust 的初學者有用:

fn increment_mut(p: &mut Vec<i32>, to_add: i32){
    for i in 0..p.len() {
        p[i] += to_add;
    }
}

fn main() {
    let mut p = vec![2, 4, 5, 6, 7];
    increment_mut(&mut p, 10);

    // Print the complete vector in Debug.
    println!("{:?}", p)
}
$ cargo run
[12, 14, 15, 16, 17]

使用iter_mut

fn increment_mut2(p: &mut Vec<i32>, to_add: i32) {
    for x in p.iter_mut() {
        *x += to_add;
    }
}

fn main() {
    let mut p = vec![2, 4, 5, 6, 7];
    increment_mut2(&mut p, 10);

    // Print the complete vector in Debug.
    println!("{:?}", p)
}
$ cargo run
[12, 14, 15, 16, 17]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM