迭代器和const_iterator(STL)的效率不同

时间:2012-04-30 10:39:03

标签: c++ stl iterator

在Qt中有类似的类来列出地图。这些类提供了一个返回const_iterator的begin_const()方法。文档说这些const_iterators应尽可能使用,因为它们更快。

如果实例本身是const,则STL仅为您提供const_iterator。只实现了一个begin()方法(为const重载)。

使用iterator和const_iterator读取元素时有什么区别吗?(我不知道为什么Qt中存在差异)

2 个答案:

答案 0 :(得分:5)

  

文档说这些const_iterators应尽可能使用,因为它们更快。

确实如此。来自http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iterators:

  

对于每个容器类,有两种STL样式的迭代器类型:一种提供只读访问,另一种提供读写访问。应尽可能使用只读迭代器,因为它们比读写迭代器更快。

这是多么愚蠢的事情。

更安全?是。快点?即使是这种情况(显然不是gcc和clang),也很少有理由更喜欢const迭代器而不是非常量迭代器。这是不成熟的优化。更喜欢const迭代器而不是非常量迭代器的原因是安全性。如果您不需要修改指向的内容,请使用const迭代器。想想一些维护程序员会对你的代码做些什么。

begincbegin而言,这是一个C ++ 11的补充。这允许auto关键字使用const迭代器,即使在非const设置中也是如此。

答案 1 :(得分:3)

使用const的最佳理由是避免错误并使代码的意图更清晰。

可以想象,在某些情况下,编译器可以执行一些使用非const迭代器无法实现的优化。别名(当多个变量和参数可能引用同一个对象时)通常是某些优化的抑制因素。如果编译器可以通过注意到const-iterator永远不会改变值来排除某些形式的别名,那么它可能会启用一些优化。

另一方面,我希望编译器能够以这种方式使用constness,以便能够通过流分析得出相同的结论。