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)
|
在范围中搜索连续 N 次出现的元素
(算法函数对象) |
|
(C++23)
(C++23)
|
检查范围是否包含给定元素或子范围
(算法函数对象) |
|
(C++23)
|
检查一个范围是否始于另一个范围
(算法函数对象) |
|
(C++23)
|
检查一个范围是否终于另一个范围
(算法函数对象) |
受约束的数值操作
|
定义于头文件
<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指定为函数对象以外的特殊实体 | 必须指定为函数对象 |