将大型 vector 的所有值重置为其默认值的最快方法是什么?
struct foo
{
int id;
float score;
};
std::vector<foo> large_vector(10000000);
最简单的方法是创建一个新 vector ,但我想重新分配内存比重新初始化现有 vector 需要更多时间?
在重置之前,我必须遍历 vector 以收集非零分数(可能是数千或数百万)。我应该在这个循环中一个一个地重置结构吗?
编辑:
vector 大小是固定的,“默认值”意味着每个结构成员(所有 float 和整数)都为 0。
最佳答案
What's the fastest way to reinitialize a vector?
不要。
只需通过调用 clear()
记录 vector 没有有效条目的事实.这样做的好处是既(可能)是最优的,又能保证正确,而且还具有完美的表现力。除非分析显示实际需要,否则不应考虑 IMO 建议的替代方案。
您的元素类型是微不足道的,因此复杂性的线性上限实际上应该是一个体面质量实现的常数 - 没有必要依次销毁每个元素。
没有内存被释放,或者以后需要重新分配。
当你在 clear()
ing 之后写入 vector 时,你只需要 push_back
或 emplace_back
,而不是使用运算符[]
。
为了与第一次使用保持一致,不要使用 10000000 个值构造元素初始化 vector ,而是使用 reserve(10000000)
进行预分配而不初始化。
例如。
int main() {
vector<foo> v;
v.reserve(10000000);
while(keep_running) {
use(v);
v.clear();
}
}
// precondition: v is empty, so
// don't access v[i] until you've done
// v.push_back({id,score})
// at least i+1 times
void use(vector<foo> &v) {
}
由于您需要就地清零元素,因此第二快的通用解决方案可能是将上面的循环更改为
while(keep_running) {
v.resize(10000000);
use(v);
v.clear();
}
或者删除 clear()
并使用 fill()
就地覆盖所有元素。
如果非零元素是稀疏的(如果您根据某个有意义的索引更新它们可能会出现这种情况),那么当您的主循环遍历 vector 时,将它们动态归零可能会更快。
同样,您确实需要分析以找出哪个更适合您的用例。
关于c++ - 重新初始化 vector 的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55266468/