这只是一个实现副作用(红黑树)还是c ++标准保证了顺序?
答案 0 :(得分:11)
有序迭代不是实现细节;它受C ++标准的保证。它是所有关联容器的基本属性(C ++03§23.1.2/ 9):
关联容器的迭代器的基本属性是它们以密钥的非降序迭代容器,其中非降序由用于构造它们的比较定义。对于任何两个可解除引用的迭代器
i
和j
,从i
到j
的距离为正,value_comp(*j, *i) == false
value_comp
是用于构建地图的比较器(默认情况下,它是std::less<T>
)。
答案 1 :(得分:4)
§23.1.2/ 2:
每个关联容器都是 参数化
Key
和排序 导致严格的关系Compare
关于元素的弱排序(25.3)Key
。 ...类型Compare
的对象是 称为a的比较对象 容器。这个比较对象 可能是指向函数或指针的指针 具有适当类型的对象 函数调用操作符。
默认Compare
对象是小于函数std::less<Key>
。
排序是该功能的属性。这是一项要求,而不是副作用。
排序对象是副作用。 23.1.2 / 10和23.1.2 / 9(James引用)保证map / set和multimap / multiset分别在从begin
到end
的序列中有增加/减少的键。
答案 2 :(得分:2)
由c ++标准保证。
答案 3 :(得分:0)
保证。如果你想要一些不受此限制的东西,请试试boost :: unordered_map&lt;&gt;