开启 https://doc-snapshots.qt.io/qtcreator-extending/coding-style.html建议编写如下 for 循环:
Container::iterator end = large.end();
for (Container::iterator it = large.begin(); it != end; ++it) {
//...;
}
而不是
for (Container::iterator it = large.begin(); it != large.end(); ++it) {
//...;
}
由于我很少在任何代码中看到这种风格,我想知道 end() 的连续调用是否真的为 STL 容器上的大型循环增加了明显的运行时开销,或者编译器是否已经优化了这种情况。
编辑: 正如许多非常好的评论所指出的那样:这个问题只有在循环内的代码不修改结束迭代器时才有效。否则,end 的重复调用当然是强制性的。
最佳答案
C++11 标准(第 23.2.1 节)要求 end
具有 O(1) 复杂度,因此符合要求的实现对于两个版本将具有相同的性能特征。
也就是说,除非编译器可以证明 end
的返回值永远不会改变,否则将 end
拉出循环可能以一定数量的速度更快(正如史蒂夫·杰索普所说,有很多变量可以影响这是否正确)。
尽管如此,即使在某个特定情况下绝对没有性能差异,将此类测试排除在循环之外也是一个好习惯。一个更好的习惯是使用@pmr 所说的标准算法,这完全回避了这个问题。
关于c++ - end() 可以是 STL 容器的 coSTLy 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9768447/