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)
但由于保证向量是连续存储的,所以肯定有更好的方法吗?
重置需要遍历向量的每个元素,因此至少需要O(n)复杂度.您当前的算法需要O(n).
在这种特殊情况下,您可以使用operator[]而不是at(可能会抛出异常).但我怀疑这是你申请的瓶颈.
在这个笔记中你应该使用std::fill:
std::fill(myVec.begin(), myVec.end(), 0);
Run Code Online (Sandbox Code Playgroud)
但除非你想要字节级别并设置一块内存0,这不仅会让你头疼,而且在大多数情况下也会让你失去可移植性,这里没有什么可以改进的.
而不是下面的代码
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().
| 归档时间: |
|
| 查看次数: |
929 次 |
| 最近记录: |