将大向量的所有值重置为其默认值的最快方法是什么?
struct foo
{
int id;
float score;
};
std::vector<foo> large_vector(10000000);
最简单的方法是创建一个新向量,但我想重新分配内存比重新初始化现有向量需要更多时间?
在重置它之前,我必须遍历向量以收集非零分数(可能是数千或数百万)。我应该在这个循环中一一重置结构吗?
编辑:
向量大小是固定的,“默认值”意味着每个结构成员(所有浮点数和整数)都为 0。
原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了确定最快的方式,您需要运行一些基准测试。
有许多不同的方法可以“重新初始化”一个向量:
clear()
,对于普通类型,这应该大致相当于只做vector.size = 0
。向量的容量不会改变,也不会释放任何元素。如果元素存在,将对元素调用析构函数。当您push_back
,emplace_back
或resize
向量旧值将被覆盖。assign()
,例如large_vector.assign( large_vector.size(), Foo() );
。这将遍历整个向量,将每个元素重置为其默认值。希望编译器能够将其优化为 memset 或类似的。0
您应该能够执行memset
,例如:memset( large_vector.data(), 0, sizeof(Foo)*large_vector.size() );
std::fill
例如std::fill( large_vector.begin(), large_vector.end(), Foo() );
,这应该类似于assign
或memset
。