受约束的算法 (C++20 起)
来自 cppreference.cn
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) |
确定两组元素是否相同 (算法函数对象) |
如果一个范围按字典序小于另一个范围,则返回 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) |
生成一个元素范围的下一个更小的字典序排列 (算法函数对象) |
[编辑] 受约束的数值运算
在头文件
<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) |
提供一种将迭代器和值存储为单个单元的方法 (类模板) |
[编辑] 注释
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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 允许被指定为特殊实体 而非函数对象 |
需要被指定为函数对象 |