约束算法 (自C++20起)
来自 zh.cppreference.net
C++20 在命名空间 约束版本的算法。在这些算法中,范围可以指定为 std::ranges迭代器-哨位对,或单个 范围参数,并支持投影和指向成员的可调用对象。此外,大多数算法的 返回类型已更改,以返回算法执行期间计算出的所有可能有用信息。
算法函数对象
一个算法函数对象(Algorithm Function Object, AFO),非正式地称为niebloid ,是一个定制点对象(Customization Point Object, CPO),其被指定为一个或多个重载的函数模板。这些函数模板的名称用于指代相应的算法函数对象。
对于一个算法函数对象o,令S为相应的函数模板集合。那么对于任何参数序列args...,o(args...)与是表达式等价s(args...)的,其中对s的名字查找结果为重载集合S。
命名空间std::ranges中受约束的算法被定义为算法函数对象。因此:
范围参数
一些重载接受 范围 参数,它们的行为如同通过分派到命名空间 ranges 中对应的重载来实现,该重载接受单独的迭代器和哨位参数,其中对于每个范围参数 r:
- 对应的迭代器参数以
ranges::begin(r)初始化。
|
(C++26 前) |
|
(C++26 起) |
不修改序列的操作
定义于头文件
<algorithm> | |
定义于命名空间
std::ranges | |
批量操作 | |
(C++20) |
应用一元 函数对象 到元素来自 范围 (算法函数对象) |
(C++20) |
将函数对象应用于序列的前N个元素 (算法函数对象) |
搜索操作 | |
(C++20)(C++20)(C++20) |
检查谓词是否对范围内所有、任意或无元素为true(算法函数对象) |
(C++23)(C++23) |
检查范围是否包含给定元素或子范围 (算法函数对象) |
(C++20)(C++20)(C++20) |
查找满足特定条件的第一个元素 (算法函数对象) |
(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++23) |
检查一个范围是否以另一个范围开头 (算法函数对象) |
(C++23) |
检查一个范围是否以另一个范围结尾 (算法函数对象) |
折叠操作 | |
(C++23) |
左折叠元素范围 (算法函数对象) |
(C++23) |
使用第一个元素作为初始值左折叠元素范围 (算法函数对象) |
(C++23) |
右折叠元素范围 (算法函数对象) |
(C++23) |
使用最后一个元素作为初始值右折叠元素范围 (算法函数对象) |
(C++23) |
左折叠元素范围,并返回一个pair(迭代器,值) (算法函数对象) |
| 使用第一个元素作为初始值左折叠元素范围,并返回一个pair(迭代器,optional) (算法函数对象) | |
修改序列操作
定义于头文件
<algorithm> | |
定义于 命名空间
std::ranges | |
复制操作 | |
(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) |
保存函数N次应用的结果 (算法函数对象) |
移除操作 | |
(C++20)(C++20) |
移除满足特定条件的元素 (算法函数对象) |
(C++20)(C++20) |
复制一个范围内的元素,并省略满足特定条件的元素 (算法函数对象) |
(C++20) |
移除范围内的连续重复元素 (算法函数对象) |
(C++20) |
创建一个不包含连续重复元素的某范围元素的副本 (算法函数对象) |
改变顺序的操作 | |
(C++20) |
反转范围内的元素顺序 (算法函数对象) |
(C++20) |
创建范围的反转副本 (算法函数对象) |
(C++20) |
旋转范围内的元素顺序 (算法函数对象) |
(C++20) |
复制并旋转元素范围 (算法函数对象) |
(C++23)(C++23) |
移动范围内的元素 (算法函数对象) |
(C++20) |
随机重排范围内的元素 (算法函数对象) |
采样操作 | |
(C++20) |
从序列中随机选择N个元素 (算法函数对象) |
定义于头文件
<algorithm> | |
定义于命名空间
std::ranges | |
分区操作 | |
(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) |
如果范围已排序,则找到第 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) |
从最大堆移除最大元素 (算法函数对象) |
(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) |
用起始值的连续增量填充范围 (算法函数对象) |
特化 <memory> 算法
定义于头文件
<memory> | |
定义于 命名空间
std::ranges | |
对象(批量)构造 | |
(C++20) |
在给定地址创建对象 (算法函数对象) |
(C++20) |
将一个范围内的对象复制到未初始化的内存区域 (算法函数对象) |
(C++20) |
将指定数量的对象复制到未初始化的内存区域 (算法函数对象) |
(C++20) |
将一个对象复制到由范围定义的未初始化的内存区域 (算法函数对象) |
(C++20) |
将一个对象复制到由起始位置和数量定义的未初始化的内存区域 (算法函数对象) |
(C++20) |
将范围内的对象移动到未初始化的内存区域 (算法函数对象) |
(C++20) |
将指定数量的对象移动到未初始化的内存区域 (算法函数对象) |
| 通过默认初始化在由范围定义的未初始化内存区域中构造对象 (算法函数对象) | |
| 通过默认初始化在由起始位置和数量定义的未初始化内存区域中构造对象 (算法函数对象) | |
| 通过值初始化在由范围定义的未初始化内存区域中构造对象 (算法函数对象) | |
| 通过值初始化在由起始位置和数量定义的未初始化内存区域中构造对象 (算法函数对象) | |
对象(批量)销毁 | |
(C++20) |
销毁一系列对象 (算法函数对象) |
(C++20) |
销毁范围内的若干对象 (算法函数对象) |
(C++20) |
销毁给定地址处的对象 (算法函数对象) |
专用<random>算法
定义于头文件
<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_parallel_algorithm |
202506L |
(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被允许指定为 除函数对象外的特殊实体 |
要求被指定 作为函数对象 |