c ++ set ordered iterating - 迭代结果集,按标准排序吗?

时间:2012-06-10 12:02:03

标签: c++ stl

我可以依赖这个假设(换句话说:它是否由标准保证?):

  • set<T>::begin()会指向集合中的最小元素吗?
  • 迭代集合,(从set<T>::begin()set<T>::end())将按顺序递增元素?
  • 并且只是为了确定:这些属性是否适用于map
  • 中的密钥

我的意思是来自set的{​​{1}}和map

P.S。我知道邻近STL并定义自己的比较器。请确保标准说明了什么?

3 个答案:

答案 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;将定义键的顺序。注:如果使用未定义(部分)顺序的布尔谓词,则可能会发生奇怪的事情。 :)