C ++对std :: set,std :: map等的常量时间开始/结束/ rbegin / rend执行吗?

时间:2008-09-17 14:09:20

标签: c++ stl

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

我一直认为开始和结束总是在恒定的时间内发生,但我在Josuttis找不到任何确认。现在我正在做一些我需要对性能进行肛门的事情,我想确保覆盖我的基础。

由于

6 个答案:

答案 0 :(得分:8)

他们在不断的时间发生。我正在查看ISO / IEC 14882:2003标准的第466页:

表65 - 容器需求

a.begin(); (常数复杂性)

a.end(); (常数复杂性)

表66 - 可逆容器要求

a.rbegin(); (常数复杂性)

a.rend(); (常数复杂性)

答案 1 :(得分:5)

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

std::map

你会看到所有结束的结果......都是在恒定时间内实现的。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

对于std :: set

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

对于std :: map

它们也是不变的(所有这些)

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