我可以依赖以下假设(换句话说:它是否有标准保证?):
set<T>::begin()
将指向集合中的最小元素?- 迭代集合,(从
set<T>::begin()
untilset<T>::end()
)将按递增顺序给出元素? - 并且只是为了确定:这些属性是否适用于键
map
?
我的意思是set
和map
从STL
。
PS我知道邻接operator<()
并定义自己的比较器。请向我保证关于这方面的标准是什么?
顺序取决于比较使用的仿函数(map 上的第三个模板参数,集合上的第二个参数)。默认值为std::less<T>
,它为集合/映射提供升序,是的。
是的,您可以根据定义依赖它,具体取决于元素的(键)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
比较函数在哪里。
简短的回答:是的。
更长的答案: std::set 和 std::map 都采用第二个模板化参数 - 一个用于比较元素的二进制谓词。默认情况下,这是 std::less - 一个实现单个布尔函数的类 - 它本身是根据运算符 < 定义的。
除非您在实例化 stl 模板时另外指定,否则 operator < 将定义键的顺序。注意 如果您使用未定义(部分)顺序的布尔谓词,可能会发生奇怪的事情。:)