首页 > 解决方案 > 什么是重置 Vec 的所有值的有效方法不调整大小?

问题描述

我可以使用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 ?

标签: vectorrust

解决方案


一般来说,最有效的方法是自己重置值(又名 B):

for item in &mut my_vec { *item = false; }

对于布尔值,这并不是很明显,但是对于 aString来说,保留每个元素的分配缓冲区很重要:

for item in &mut my_vec { item.clear(); }

如果丢弃和重新创建 的元素Vec很便宜,例如布尔值的情况,或者如果元素无论如何都会被覆盖,那么 和 的组合clearresize容易:

my_vec.clear();
my_vec.resize(my_vec_size, false);

推荐阅读