重置Vec <T>的所有值而不调整其大小的有效方法是什么?

m.r*_*nal 1 vector rust

我可以使用resize,但似乎有点过头了,因为我不需要调整向量的大小,只需修改其值即可。不能选择使用新变量,因为此向量实际上是结构中的一个字段。

我猜这resize是有效的,可能是我的问题的答案,但是它的名称并不具有在不更改大小的情况下重置值的含义。

在C语言中,我将使用memset(反对realloc)。

我的问题的插图:

let my_vec_size = 42;
let mut my_vec = Vec::new();       //  'my_vec' will always have a size of 42
my_vec.resize(my_vec_size, false); //  Set the size to 42, and all values to false

// [ ... ] piece of code where the values in 'my_vec' will be modified, checked, etc ...


// now I need to reuse my_vec.
// Possibility A -> use resize again
my_vec.resize(my_vec_size, false);

// Possibility B -> iterate on the vector to modify its values (long and laborious)
for item in my_vec.iter_mut() {
    *item = false;
}

// Possibility C ?
Run Code Online (Sandbox Code Playgroud)

She*_*ter 6

resize其本身无法重置”值:

const LEN: usize = 3;

fn main() {
    let mut values = vec![false; LEN];

    values[0] = true;

    values.resize(LEN, false);
    println!("{:?}", values); // [true, false, false]
}
Run Code Online (Sandbox Code Playgroud)

只需使用 for 循环:

for v in &mut values {
    *v = false;
}
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)

如果这种景象冒犯了你,请写一个扩展特征

trait ResetExt<T: Copy> {
    fn reset(&mut self, val: T);
}

impl<T: Copy> ResetExt<T> for [T] {
    fn reset(&mut self, value: T) {
        for v in self {
            *v = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
values.reset(false);
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)

如果这对您的情况有意义的话,可以扩展特征思想,以便每个值都知道如何重置自身:

trait ResetExt {
    fn reset(&mut self);
}

impl<T: ResetExt> ResetExt for [T] {
    fn reset(&mut self) {
        for v in self {
            v.reset();
        }
    }
}

impl ResetExt for bool {
    fn reset(&mut self) {
        *self = false;
    }
}

impl ResetExt for String {
    fn reset(&mut self) {
        self.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)
values.reset();
println!("{:?}", values); // [false, false, false]
Run Code Online (Sandbox Code Playgroud)

  • 清除+调整大小效果很好,只是会破坏和重新创建可能不便宜的元素。 (2认同)

Mat*_* M. 5

通常,最有效的方法是自行重置值(也称为B):

for item in &mut my_vec { *item = false; }
Run Code Online (Sandbox Code Playgroud)

对于布尔值,并不是立即显而易见的,但是对于a String而言,保留每个元素的已分配缓冲区很重要:

for item in &mut my_vec { item.clear(); }
Run Code Online (Sandbox Code Playgroud)

如果丢弃和重新创建的元素Vec很便宜(例如布尔值的情况),或者如果元素将被覆盖,则将clear和组合起来resize会更容易:

my_vec.clear();
my_vec.resize(my_vec_size, false);
Run Code Online (Sandbox Code Playgroud)