在向量的每个struct元素中重置值的最快方法?

OJF*_*ord 8 c++ performance vector

非常喜欢这个问题,除了vector<int>我有vector<struct myType>.

如果我想为myType.myVar向量中的每个元素重置(或者就此而言,设置为某个值),那么最有效的方法是什么?

现在我正在迭代:

for(int i=0; i<myVec.size(); i++) myVec.at(i).myVar = 0;
Run Code Online (Sandbox Code Playgroud)

但由于保证向量是连续存储的,所以肯定有更好的方法吗?

Sho*_*hoe 7

重置需要遍历向量的每个元素,因此至少需要O(n)复杂度.您当前的算法需要O(n).

在这种特殊情况下,您可以使用operator[]而不是at(可能会抛出异常).但我怀疑这是你申请的瓶颈.

在这个笔记中你应该使用std::fill:

std::fill(myVec.begin(), myVec.end(), 0);
Run Code Online (Sandbox Code Playgroud)

但除非你想要字节级别并设置一块内存0,这不仅会让你头疼,而且在大多数情况下也会让你失去可移植性,这里没有什么可以改进的.


Man*_*mar 6

而不是下面的代码

for(int i=0; i<myVec.size(); i++) myVec.at(i).myVar = 0;
Run Code Online (Sandbox Code Playgroud)

做到如下:

size_t sz = myVec.size();
for(int i=0; i<sz; ++i) myVec[i].myVar = 0;
Run Code Online (Sandbox Code Playgroud)

由于"at"方法在内部检查索引是否超出范围.但是当你的循环索引正在照顾(myVec.size())时,你可以避免额外的检查.否则,这是最快的方法.

编辑

除此之外,我们可以在执行for循环之前存储向量的size().这将确保for循环中没有进一步调用方法size().