C ++是否会在恒定时间内为std :: set,std :: map等执行begin / end / rbegin / rend?
时间:2020-03-05 18:58:57 来源:igfitidea点击:
对于std :: set和std :: map这样的数据类型,其中以对数时间进行查找,是否需要实现来维护begin和end迭代器?访问开始和结束是否意味着可能会在对数时间内进行查找?
我一直以为开始和结束总是在恒定的时间发生,但是在Josuttis中找不到对此的任何确认。既然我正在做一些需要对性能进行分析的工作,那么我想确保掩盖了自己的基础。
谢谢
解决方案
回答
是的,根据http://www.cplusplus.com/reference/stl/,begin(),end()等都是O(1)。
回答
在C ++标准中,表23.1(容器要求)中的表65列出了begin()和end()需要恒定的时间。如果实现违反了此要求,则说明不符合要求。
回答
只需查看代码,即可在GNU libstdc ++的std :: map中看到迭代器
std :: map
我们会看到所有end rend cend ...都是在恒定时间内实现的。
回答
对于std :: set
开始:常数,结束:常数,
rbegin:常量,
撕裂:恒定,
对于std :: map
他们也是不变的(所有人)
如有任何疑问,请访问www.cplusplus.com
回答
他们发生在恒定的时间。我正在查看ISO / IEC 14882:2003标准的第466页:
表65容器要求
a.begin(); (不变的复杂性)
a.end(); (不变的复杂性)
表66可逆容器要求
a.rbegin(); (恒定的复杂度)
a.rend(); (恒定的复杂度)
回答
但是请谨慎使用hash_map。 begin()不是常数。