2

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

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

我的意思是setmapSTL

PS我知道邻接operator<()并定义自己的比较器。请向我保证关于这方面的标准是什么?

4

3 回答 3

6

顺序取决于比较使用的仿函数(map 上的第三个模板参数,集合上的第二个参数)。默认值为std::less<T>,它为集合/映射提供升序,是的。

于 2012-06-10T12:03:31.260 回答
6

是的,您可以根据定义依赖它,具体取决于元素的(键)bool operator<或作为模板参数传递给集合(映射)的比较函子。因此,排序将根据使用的比较器从小到大。

在 C++11 标准 §23.2.4 中,处理关联容器的要求:

每个关联容器都在 Key 和一个排序关系 Compare 上参数化,该排序关系对 Key 的元素产生严格的弱排序 (25.4)。此外,map 和 multimap 将任意类型 T 与 Key 相关联。Compare 类型的对象称为容器的比较对象。

然后,在同一部分:

关联容器的迭代器的基本属性是它们以键的非降序遍历容器,其中非降序由用于构造它们的比较定义。对于任何两个可解引用的迭代器 i 和 j 使得从 i 到 j 的距离为正,value_comp(*j, *i) == false

value_comp比较函数在哪里。

于 2012-06-10T12:03:49.477 回答
1

简短的回答:是的。

更长的答案: std::set 和 std::map 都采用第二个模板化参数 - 一个用于比较元素的二进制谓词。默认情况下,这是 std::less - 一个实现单个布尔函数的类 - 它本身是根据运算符 < 定义的。

除非您在实例化 stl 模板时另外指定,否则 operator < 将定义键的顺序。注意 如果您使用未定义(部分)顺序的布尔谓词,可能会发生奇怪的事情。:)

于 2012-06-10T12:06:43.673 回答