c++ - end() 可以是 STL 容器的 coSTLy 操作

标签 c++ performance stl containers

开启 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/

相关文章:

c++ - 如何查找右值引用是否是显式应用 std::move 的结果?

c++ - 无法使用 cimg 库将图像正确保存到文件

c++ - 叉(): Dont return from child until it's terminated

在 std::array 中使用默认参数调用 C++ 函数?

c++ - 没有这样的插槽 QProgressBar::setValue(const int)

python 风格 : inline function that needs no inlining?

c - 霍夫曼表熵解码简化(在 C 中)

c# - 获取集合的缓存模式

c++ - 复制 std::vector:更喜欢赋值还是 std::copy?

c++ - 取消引用 std::shared_ptr<T[]>?