在 Qt 中有类似的类来列出地图。这些类提供了一个返回 const_iterator 的 begin_const() 方法。文档说这些 const_iterators 应该尽可能使用,因为它们更快。
如果实例本身是 const,STL 只会给你一个 const_iterator。只实现了一个 begin() 方法(为 const 重载)。
使用 iterator 和 const_iterator 读取访问元素时有什么区别吗?(我不知道为什么他们在 Qt 中有所不同)
文档说这些 const_iterators 应该尽可能使用,因为它们更快。
确实如此。来自 http://qt-project.org/doc/qt-4.8/containers.html#stl-style-iterators:
对于每个容器类,有两种 STL 风格的迭代器类型:一种提供只读访问,另一种提供读写访问。应尽可能使用只读迭代器,因为它们比读写迭代器更快。
说什么傻话。
更安全?是的。快点?即使是这种情况(显然不是 gcc 和 clang),也很少有理由选择 const 迭代器而不是非 const 迭代器。这是过早的优化。相比非 const 迭代器更喜欢 const 迭代器的原因是安全性。如果您不需要修改指向的内容,请使用 const 迭代器。想想一些维护程序员会对你的代码做什么。
就begin
vs.cbegin
而言,这是 C++11 的新增功能。这允许auto
关键字使用 const 迭代器,即使在非常量设置中也是如此。
使用 const 的最佳理由是避免错误并使代码的意图更加清晰。
可以想象,在某些情况下,编译器可以执行一些非 const 迭代器无法实现的优化。别名(当多个变量和参数可能引用同一个对象时)通常是某些优化的抑制剂。如果编译器可以通过指出 const-iterator 永远不能更改值来排除某些形式的别名,那么它可能会启用一些优化。
另一方面,我希望编译器能够以这种方式使用 constness,从而能够通过流分析得出相同的结论。