Constrained algorithms (since C++20)
C++20 在命名空间
std::ranges
中提供了大多数算法的
受约束
版本。在这些算法中,范围可以通过
迭代器
-
哨位
对或单个
range
参数来指定,并且支持投影和成员指针可调用对象。此外,大多数算法的
返回类型
已改为返回算法执行期间计算的所有潜在有用信息。
目录 |
算法函数对象
算法函数对象 (AFO),非正式称为 niebloid ,是一种 定制点对象 (CPO),其被指定为一个或多个重载函数模板。这些函数模板的名称指代相应的算法函数对象。
对于一个算法函数对象
o
,令
S
为对应的函数模板集合。则对于任意参数序列
args...
,
o
(
args...
)
与
s
(
args...
)
表达式等价
,其中对
s
进行名称查找的结果为重载集
S
。
命名空间
std::ranges
中的约束算法被定义为算法函数对象。因此:
受约束算法
|
定义于头文件
<algorithm>
|
|
|
定义于 命名空间
std::ranges
|
|
非修改型序列操作 |
|
|
(C++20)
(C++20)
(C++20)
|
检查谓词是否对范围中的所有、任一或没有元素为
true
(算法函数对象) |
|
(C++20)
|
对
函数对象
应用一元操作到
范围
中的元素
(算法函数对象) |
|
(C++20)
|
对序列的前N个元素应用函数对象
(算法函数对象) |
|
(C++20)
(C++20)
|
返回满足特定条件的元素数量
(算法函数对象) |
|
(C++20)
|
查找两个范围首次出现差异的位置
(算法函数对象) |
|
(C++20)
|
判断两组元素是否相同
(算法函数对象) |
|
(C++20)
|
若一个范围按字典序小于另一个范围则返回
true
(算法函数对象) |
|
(C++20)
(C++20)
(C++20)
|
查找满足特定条件的首个元素
(算法函数对象) |
|
(C++23)
(C++23)
(C++23)
|
查找满足特定条件的最后一个元素
(算法函数对象) |
|
(C++20)
|
在特定范围内查找元素的最后序列
(算法函数对象) |
|
(C++20)
|
搜索一组元素中的任意一个元素
(算法函数对象) |
|
(C++20)
|
查找首个相邻的相等元素(或满足给定谓词的元素对)
(算法函数对象) |
|
(C++20)
|
搜索元素范围的首次出现
(算法函数对象) |
|
(C++20)
|
在范围中搜索首次出现的连续多个相同元素
(算法函数对象) |
|
(C++23)
(C++23)
|
检查范围是否包含给定元素或子范围
(算法函数对象) |
|
(C++23)
|
检查一个范围是否以另一个范围开头
(算法函数对象) |
|
(C++23)
|
检查一个范围是否以另一个范围结尾
(算法函数对象) |
修改序列操作 |
|
|
(C++20)
(C++20)
|
将元素范围复制到新位置
(算法函数对象) |
|
(C++20)
|
复制指定数量的元素到新位置
(算法函数对象) |
|
(C++20)
|
以逆序复制范围内的元素
(算法函数对象) |
|
(C++20)
|
将元素范围移动到新位置
(算法函数对象) |
|
(C++20)
|
将元素范围按逆序移动到新位置
(算法函数对象) |
|
(C++20)
|
为范围内的元素赋予指定值
(算法函数对象) |
|
(C++20)
|
对指定数量的元素赋值
(算法函数对象) |
|
(C++20)
|
对范围内的元素应用函数
(算法函数对象) |
|
(C++20)
|
将函数的执行结果保存到范围中
(算法函数对象) |
|
(C++20)
|
保存函数应用 N 次的结果
(算法函数对象) |
|
(C++20)
(C++20)
|
移除满足特定条件的元素
(算法函数对象) |
|
(C++20)
(C++20)
|
复制范围元素并忽略满足特定条件的元素
(算法函数对象) |
|
(C++20)
(C++20)
|
将满足特定条件的所有值替换为另一个值
(算法函数对象) |
|
(C++20)
(C++20)
|
复制一个范围,将满足特定条件的元素替换为另一个值
(算法函数对象) |
|
(C++20)
|
交换两个元素范围
(算法函数对象) |
|
(C++20)
|
反转范围中元素的顺序
(算法函数对象) |
|
(C++20)
|
创建反转范围的副本
(算法函数对象) |
|
(C++20)
|
旋转范围内的元素顺序
(算法函数对象) |
|
(C++20)
|
复制并旋转元素范围
(算法函数对象) |
|
(C++20)
|
随机重排范围内的元素
(算法函数对象) |
|
移动范围内的元素
(算法函数对象) |
|
|
(C++20)
|
从序列中随机选择 N 个元素
(算法函数对象) |
|
(C++20)
|
移除范围中的连续重复元素
(算法函数对象) |
|
(C++20)
|
创建不包含连续重复元素的区间副本
(算法函数对象) |
分区操作 |
|
|
(C++20)
|
判断范围是否按给定谓词被划分
(算法函数对象) |
|
(C++20)
|
将元素范围划分为两组
(算法函数对象) |
|
(C++20)
|
复制范围并将元素划分为两组
(算法函数对象) |
|
(C++20)
|
将元素划分为两组并保持其相对顺序
(算法函数对象) |
|
(C++20)
|
定位已分区范围的分割点
(算法函数对象) |
排序操作 |
|
|
(C++20)
|
检查范围是否按升序排序
(算法函数对象) |
|
(C++20)
|
寻找最大有序子范围
(算法函数对象) |
|
(C++20)
|
将范围按升序排序
(算法函数对象) |
|
(C++20)
|
对范围的前 N 个元素进行排序
(算法函数对象) |
|
(C++20)
|
复制并部分排序元素范围
(算法函数对象) |
|
(C++20)
|
对元素范围进行排序并保持相等元素间的相对顺序
(算法函数对象) |
|
(C++20)
|
对给定范围进行部分排序,确保其按指定元素完成划分
(算法函数对象) |
二分查找操作(作用于有序区间) |
|
|
(C++20)
|
返回指向首个
不小于
给定值的元素的迭代器
(算法函数对象) |
|
(C++20)
|
返回指向首个
大于
特定值的元素的迭代器
(算法函数对象) |
|
(C++20)
|
确定元素是否存在于部分有序范围内
(算法函数对象) |
|
(C++20)
|
返回匹配特定键的元素范围
(算法函数对象) |
集合操作(作用于已排序范围) |
|
|
(C++20)
|
合并两个已排序的范围
(算法函数对象) |
|
(C++20)
|
原地合并两个有序范围
(算法函数对象) |
|
(C++20)
|
若一个序列是另一个序列的子序列则返回
true
(算法函数对象) |
|
(C++20)
|
计算两个集合的差集
(算法函数对象) |
|
(C++20)
|
计算两个集合的交集
(算法函数对象) |
|
(C++20)
|
计算两个集合的对称差
(算法函数对象) |
|
(C++20)
|
计算两个集合的并集
(算法函数对象) |
堆操作 |
|
|
(C++20)
|
检查给定范围是否为最大堆
(算法函数对象) |
|
(C++20)
|
寻找构成最大堆的最大子范围
(算法函数对象) |
|
(C++20)
|
将范围内的元素构建为最大堆
(算法函数对象) |
|
(C++20)
|
向最大堆添加元素
(算法函数对象) |
|
(C++20)
|
从最大堆中移除最大元素
(算法函数对象) |
|
(C++20)
|
将最大堆转换为按升序排序的元素范围
(算法函数对象) |
最小/最大操作 |
|
|
(C++20)
|
返回给定值中的较大者
(算法函数对象) |
|
(C++20)
|
返回范围中的最大元素
(算法函数对象) |
|
(C++20)
|
返回给定值中的较小值
(算法函数对象) |
|
(C++20)
|
返回范围内的最小元素
(算法函数对象) |
|
(C++20)
|
返回两个元素中的较小值和较大值
(算法函数对象) |
|
(C++20)
|
返回范围中的最小和最大元素
(算法函数对象) |
|
(C++20)
|
将值限制在一对边界值之间
(算法函数对象) |
置换操作 |
|
|
(C++20)
|
判断一个序列是否是另一个序列的排列
(算法函数对象) |
|
(C++20)
|
生成元素范围的下一个更大字典序排列
(算法函数对象) |
|
(C++20)
|
生成元素范围的下一个较小字典序排列
(算法函数对象) |
受约束数值运算
|
定义于头文件
<numeric>
|
|
|
定义于命名空间
std::ranges
|
|
|
(C++23)
|
用起始值的连续增量填充范围
(算法函数对象) |
受限折叠操作
|
定义于头文件
<algorithm>
|
|
|
定义于命名空间
std::ranges
|
|
|
(C++23)
|
左折叠元素范围
(算法函数对象) |
|
(C++23)
|
使用首元素作为初始值左折叠元素范围
(算法函数对象) |
|
(C++23)
|
右折叠元素范围
(算法函数对象) |
|
(C++23)
|
使用末元素作为初始值右折叠元素范围
(算法函数对象) |
|
(C++23)
|
左折叠元素范围,并返回
pair
(迭代器, 值)
(算法函数对象) |
|
使用首元素作为初始值左折叠元素范围,并返回
pair
(迭代器,
optional
)
(算法函数对象) |
|
受约束的未初始化内存算法
|
定义于头文件
<memory>
|
|
|
定义于命名空间
std::ranges
|
|
|
(C++20)
|
复制对象范围到未初始化的内存区域
(算法函数对象) |
|
(C++20)
|
复制指定数量的对象到未初始化的内存区域
(算法函数对象) |
|
(C++20)
|
复制对象到由范围定义的未初始化内存区域
(算法函数对象) |
|
(C++20)
|
复制对象到由起始点和计数定义的未初始化内存区域
(算法函数对象) |
|
(C++20)
|
移动对象范围到未初始化的内存区域
(算法函数对象) |
|
(C++20)
|
移动指定数量的对象到未初始化的内存区域
(算法函数对象) |
|
通过
默认初始化
在由范围定义的未初始化内存区域中构造对象
(算法函数对象) |
|
|
通过
默认初始化
在由起始点和计数定义的未初始化内存区域中构造对象
(算法函数对象) |
|
|
通过
值初始化
在由范围定义的未初始化内存区域中构造对象
(算法函数对象) |
|
|
通过
值初始化
在由起始点和计数定义的未初始化内存区域中构造对象
(算法函数对象) |
|
|
(C++20)
|
销毁对象范围
(算法函数对象) |
|
(C++20)
|
销毁范围内的指定数量的对象
(算法函数对象) |
|
(C++20)
|
销毁给定地址处的对象
(算法函数对象) |
|
(C++20)
|
在给定地址处创建对象
(算法函数对象) |
受限随机数生成算法
|
定义于头文件
<random>
|
|
|
定义于命名空间
std::ranges
|
|
|
(C++26)
|
用均匀随机比特生成器生成的随机数填充范围
(算法函数对象) |
返回类型
|
定义于头文件
<algorithm>
|
|
|
定义于命名空间
std::ranges
|
|
|
(C++20)
|
提供将迭代器和函数对象作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将两个迭代器作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将两个迭代器作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将三个迭代器作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将三个迭代器作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将两个相同类型的对象或引用作为单一单元存储的方式
(类模板) |
|
(C++20)
|
提供将迭代器和布尔标志作为单一单元存储的方式
(类模板) |
|
(C++23)
|
提供将迭代器和值作为单一单元存储的方式
(类模板) |
|
(C++23)
|
提供将迭代器和值作为单一单元存储的方式
(类模板) |
注释
| 特性测试 宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type
|
202403L
|
(C++26) | 算法的列表初始化 |
__cpp_lib_ranges
|
201911L
|
(C++20) | 范围库 和 约束算法 |
__cpp_lib_ranges_contains
|
202207L
|
(C++23) | std::ranges::contains |
__cpp_lib_ranges_find_last
|
202207L
|
(C++23) | std::ranges::find_last |
__cpp_lib_ranges_fold
|
202207L
|
(C++23) |
std::ranges
折叠算法
|
__cpp_lib_ranges_iota
|
202202L
|
(C++23) | std::ranges::iota |
__cpp_lib_ranges_starts_ends_with
|
202106L
|
(C++23) | std::ranges::starts_with , std::ranges::ends_with |
__cpp_lib_shift
|
201806L
|
(C++20) | std::shift_left , std::shift_right |
202202L
|
(C++23) | std::ranges::shift_left , std::ranges::shift_right | |
__cpp_lib_ranges_generate_random
|
202403L
|
(C++26) | std::ranges::generate_random |
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| DR | 适用版本 | 发布行为 | 正确行为 |
|---|---|---|---|
| P3136R1 | C++20 | niebloids 允许被指定为函数对象以外的特殊实体 | 必须被指定为函数对象 |