C++ 具名要求:比较 (Compare)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

比较 (Compare) 是一些标准库设施针对用户提供的函数对象类型所期待的一组要求。

对满足比较 (Compare) 的类型的对象运用函数调用操作的返回值,当转换bool 时,若此类型所引入的严格弱序关系中,该调用的第一实参先于第二实参,则生成 true,否则生成 false

与任何二元谓词 (BinaryPredicate) 相同,不允许该表达式的求值通过解引用的迭代器调用非 const 函数并且在语法上,此函数调用操作必须接受 const 对象实参,且无论实参是 const 还是非 const 都具有相同行为。

要求

类型 T 满足比较 (Compare) ,如果

给定

  • T 类型的对象 comp
  • equiv(a, b),为表达式等价!comp(a, b) && !comp(b, a) 的表达式

下列表达是必须合法且拥有指定的效果:

表达式返回类型要求
comp(a, b)

符合可布尔测试 (BooleanTestable)

(C++20 前)

实现 boolean-testable

(C++20 起)
建立具有下列性质的严格弱序关系
  • 对于所有 acomp(a, a) == false
  • comp(a, b) == truecomp(b, a) == false
  • comp(a, b) == truecomp(b, c) == truecomp(a, c) == true
equiv(a, b)bool建立具有下列性质的等价关系
  • 对于所有 aequiv(a, a) == true
  • equiv(a, b) == trueequiv(b, a) == true
  • equiv(a, b) == trueequiv(b, c) == trueequiv(a, c) == true

注:compequiv 所确定的等价类上引入了一种严格全序

标准库

下列标准库设施期待比较 (Compare) 类型。

唯一键的集合,按照键排序
(类模板)
键值对的集合,按照键排序,键是唯一的
(类模板)
键的集合,按照键排序
(类模板)
键值对的集合,按照键排序
(类模板)
适配一个容器以提供优先级队列
(类模板)
将范围按升序排序
(函数模板)
对元素进行排序
(std::forward_list<T,Allocator> 的公开成员函数)
对元素进行排序
(std::list<T,Allocator> 的公开成员函数)
将范围中元素排序,同时保持相等元之间的顺序
(函数模板)
将范围中前 N 个元素排序
(函数模板)
复制范围中元素并部分排序
(函数模板)
(C++11)
检查范围是否已按升序排列
(函数模板)
找出最大的有序子范围
(函数模板)
将给定范围部分排序,确保其按给定元素划分
(函数模板)
返回首个不小于 给定值的元素的迭代器
(函数模板)
返回首个大于 给定值的元素的迭代器
(函数模板)
判断元素是否在偏序范围中
(函数模板)
返回匹配特定键值的元素范围
(函数模板)
合并两个有序范围
(函数模板)
合并两个有序列表
(std::forward_list<T,Allocator> 的公开成员函数)
合并两个有序列表
(std::list<T,Allocator> 的公开成员函数)
就地合并两个有序范围
(函数模板)
当一个序列是另一个的子序列时返回 true
(函数模板)
计算两个集合的差集
(函数模板)
计算两个集合的交集
(函数模板)
计算两个集合的对称差
(函数模板)
计算两个集合的并集
(函数模板)
添加元素到最大堆
(函数模板)
移除最大堆中最大元
(函数模板)
从元素范围创建最大堆
(函数模板)
将最大堆变成按升序排序的元素范围
(函数模板)
检查给定范围是否为最大堆
(函数模板)
查找能成为最大堆的最大子范围
(函数模板)
返回给定值中较大者
(函数模板)
返回范围中最大元
(函数模板)
返回给定值中较小者
(函数模板)
返回范围中最小元
(函数模板)
(C++11)
返回两个元素间的较小者和较大者
(函数模板)
返回范围中的最小元和最大元
(函数模板)
当一个范围字典序小于另一个时返回 true
(函数模板)
生成元素范围的下一个字典序更大的排列
(函数模板)
生成元素范围的下一个字典序更小的排列
(函数模板)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告应用于出版时的行为正确行为
LWG 2114
(P2167R3)
C++98返回类型到 bool 的按语境可转换性不反映实现的实践更正要求
LWG 3031C++98const 值上的要求不充分加强要求

参阅

指定 relation 施加的是严格弱序
(概念)
比较运算符<<=>>===!= <=>(C++20 起),比较其实参