【问题标题】:Different efficiency of iterator and const_iterator (STL)iterator 和 const_iterator (STL) 效率不同
【发布时间】:2012-05-10 01:40:41
【问题描述】:

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

如果实例本身是 const,STL 只会给你一个 const_iterator。只实现了一个 begin() 方法(为 const 重载)。

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

【问题讨论】:

  • 当你从古老的stl切换到当前版本的c++标准库时,你会得到一个返回const_iterators的cbegin函数。另请注意,您可以将迭代器分配给 const_iterators,并且 begin 的 const 版本也返回一个 const 迭代器(全部用于 c++ 标准库)。
  • 我的参考资料是 cplusplus.com。没有 cbegin()。你能给我指出一个不错的、更新的 STL 参考吗?现在问题更加紧迫,因为有一个 cbegin() 方法......
  • PlasmaHH 指向的函数是 C++11 的一部分:article 但我不知道使用迭代器而不是 const 迭代器是否存在性能问题。
  • @HWende:正如我在评论中所说,当您从 stl 切换到当前的 c++ 标准库时,您就拥有了它。 stl 没有它,而且由于上一次修订是从 ~2000 年开始的,所以它不会得到它。对于 c++ 标准库,en.cppreference.com/w/cpp/container/map 这几天似乎相当不错。
  • @HWende 为避免混淆,STL 与 C++ 标准不同,尽管术语经常混淆。底线是你说的对C++98、C++03也是对的,但是C++11提供了PlasmaHH提到的方法。

标签: c++ stl iterator


【解决方案1】:

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

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

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

说什么傻话。

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

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

【讨论】:

  • 因此,即使 Qt 中可能存在某种差异,我现在假设 C++ 中没有差异。我也同意不会仅仅因为性能原因而取消正常/常量。感谢您的明确声明!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2017-12-06
    • 2021-12-29
    • 1970-01-01
    • 2020-04-03
    • 2015-01-16
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多