【问题标题】:C++ does begin/end/rbegin/rend execute in constant time for std::set, std::map, etc?C++ 是否在 std::set、std::map 等的恒定时间内执行 begin/end/rbegin/rend?
【发布时间】:2010-09-10 03:56:12
【问题描述】:

对于像 std::set 和 std::map 这样的数据类型,在对数时间内进行查找,是否需要维护开始和结束迭代器的实现?访问开始和结束是否意味着可能在对数时间内发生的查找?

我一直认为开始和结束总是在恒定时间内发生,但是我在 Josuttis 中找不到任何证实。现在我正在做一些我需要对性能保持冷静的事情,我想确保涵盖我的基础。

谢谢

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    它们发生在恒定的时间。我正在查看 ISO/IEC 14882:2003 标准的第 466 页:

    表 65 - 容器要求

    a.begin(); (恒定复杂度)

    a.end(); (恒定复杂度)

    表 66 - 可逆容器要求

    a.rbegin(); (恒定复杂度)

    a.rend(); (恒定复杂度)

    【讨论】:

      【解决方案2】:

      是的,根据http://www.cplusplus.com/reference/stl/,begin()、end()等都是O(1)。

      【讨论】:

        【解决方案3】:

        在 C++ 标准中,23.1(容器要求)中的表 65 将 begin() 和 end() 列为需要恒定时间。如果您的实现违反了这一点,则说明它不符合要求。

        【讨论】:

          【解决方案4】:

          只看代码,这里可以看到 GNU libstdc++ 中 std::map 中的迭代器

          std::map

          你会看到所有 end rend cend ... 都是在恒定时间内实现的。

          【讨论】:

            【解决方案5】:

            不过要小心 hash_map。 begin() 不是常数。

            【讨论】:

              【解决方案6】:

              对于 std::set

              开始:常量,结束:常量, rbegin:常数, 撕裂:常数,

              对于 std::map

              它们也是恒定的(全部)

              如果您有任何疑问,请查看www.cplusplus.com

              【讨论】:

              • 不要过分依赖cplusplus.com
              猜你喜欢
              • 2012-12-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-20
              • 1970-01-01
              • 2021-08-18
              • 2012-08-16
              • 2015-01-15
              相关资源
              最近更新 更多