C++ 是否在 std::set、std::map 等的恒定时间内执行 begin/end/rbegin/rend ?
题
对于诸如 std::set 和 std::map 之类的数据类型,其中查找发生在对数时间内,是否需要实现来维护开始和结束迭代器?访问开始和结束是否意味着可能在对数时间内发生查找?
我一直假设开始和结束总是在恒定时间内发生,但是我在 Josuttis 中找不到任何对此的确认。现在我正在做一些需要对性能进行严格控制的事情,我想确保覆盖我的基础。
谢谢
解决方案
它们以恒定的时间发生。我正在查看 ISO/IEC 14882:2003 标准的第 466 页:
表 65 - 容器要求
a. 开始(); (复杂性恒定)
a.end(); (复杂性恒定)
表 66 - 可逆容器要求
a.rbegin(); (复杂性恒定)
a. 撕裂(); (复杂性恒定)
其他提示
是的,根据 http://www.cplusplus.com/reference/stl/, 、begin()、end() 等都是 O(1)。
在 C++ 标准中,23.1(容器要求)中的表 65 列出了要求恒定时间的 begin() 和 end()。如果您的实现违反了这一点,则它不符合要求。
不过要小心 hash_map 。begin() 不是常量。
不隶属于 StackOverflow