vector - 什么是重置 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 ?
解决方案
一般来说,最有效的方法是自己重置值(又名 B):
for item in &mut my_vec { *item = false; }
对于布尔值,这并不是很明显,但是对于 aString
来说,保留每个元素的分配缓冲区很重要:
for item in &mut my_vec { item.clear(); }
如果丢弃和重新创建 的元素Vec
很便宜,例如布尔值的情况,或者如果元素无论如何都会被覆盖,那么 和 的组合clear
更resize
容易:
my_vec.clear();
my_vec.resize(my_vec_size, false);
推荐阅读
- python - 如何在 Django Oscar 中自定义复杂的 Url 模式
- swift - 将 SKNode 作为函数的参数传递时出错
- mysql - Mysql C API:命令不同步;你现在不能运行这个命令
- python - 如何使用单个 tkinter 函数比较两个条目的输入以获取一堆这样的条目对?
- python - 合并 dask 数据帧时遇到问题
- assembly - 当代 x86 处理器中的指令融合是什么?
- c# - SQL Server 探查器审核 SqlConnection 对象创建时的登录。池子的作用是什么?
- android - 使用或覆盖已弃用的 API。使用 -Xlint:deprecation 重新编译以获取详细信息
- scala - 如何记录传入的请求和响应?
- algorithm - 元组非指数算法中不同元素的总和