我可以依赖这个假设(换句话说:它是否由标准保证?):
set<T>::begin()
会指向集合中的最小元素吗?set<T>::begin()
到set<T>::end()
)将按顺序递增元素?map
?我的意思是来自set
的{{1}}和map
。
P.S。我知道邻近STL
并定义自己的比较器。请确保标准说明了什么?
答案 0 :(得分:6)
顺序取决于比较使用的仿函数(地图上的第三个模板参数,第二个集合)。默认值为std::less<T>
,它为集合/地图提供升序,是。
答案 1 :(得分:5)
是的,您可以依赖于定义,具体取决于元素的(键)bool operator<
或作为模板参数传递给集合(map)的比较函子。因此,根据所使用的比较器,排序将从最小到最大。
在C ++ 11标准中,§23.2.4,处理关联容器的要求:
每个关联容器都在Key上进行参数化和一个排序关系比较,它对Key的元素产生严格的弱排序(25.4)。此外,map和multimap将任意类型T与Key相关联。 Compare类型的对象称为容器的比较对象。
然后,在同一部分:
关联容器的迭代器的基本属性是它们遍历容器 按键的非降序顺序,其中非降序由用于的比较定义 构建它们。对于任何两个可解除引用的迭代器i和j,使得从i到j的距离为正, value_comp(* j,* i)== false
其中value_comp
是比较函数。
答案 2 :(得分:1)
简短回答:是的。
更长的答案:std :: set和std :: map都采用了第二个模板化参数 - 用于比较元素的二元谓词。默认情况下,这是std :: less - 一个实现单个布尔函数的类 - 它本身是根据operator&lt;。
定义的。除非在实例化stl模板时另行指定,否则运算符&lt;将定义键的顺序。注:如果使用未定义(部分)顺序的布尔谓词,则可能会发生奇怪的事情。 :)