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

Different efficiency of iterator and const_iterator (STL)

本文关键字:STL 效率 const iterator 迭代器      更新时间:2023-10-16

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

STL 仅当实例本身是 const 时为您提供const_iterator。只实现了一个 begin(( 方法(对于 const 重载(。

使用迭代器和const_iterator读取访问元素时有什么区别吗?(我不知道为什么它们在Qt中有所不同(

文档说,应尽可能使用这些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 设置中也是如此。

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

可以

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

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