受约束算法 (C++20 起)
C++20 在命名空间 std::ranges 中提供大多数算法的受约束版本,可以迭代器-哨位对或单个 range 实参来指定范围,并且支持投影和指向成员指针可调用对象。另外还更改了大多数算法的返回类型,以返回算法执行过程中计算的所有潜在有用信息。
受约束算法
| 
 在标头  
<algorithm> 定义 | 
|
| 
 在命名空间  
std::ranges 定义 | 
|
不修改序列的操作 | 
|
| 
 (C++20)(C++20)(C++20) 
 | 
检查谓词是否对范围中所有、任一或无元素为 true (niebloid)  | 
| 
 (C++20) 
 | 
应用函数到范围中的元素 (niebloid)  | 
| 
 (C++20) 
 | 
应用函数对象到序列的前 n 个元素 (niebloid)  | 
| 
 (C++20)(C++20) 
 | 
返回满足指定判别标准的元素数 (niebloid)  | 
| 
 (C++20) 
 | 
寻找两个范围出现不同的首个位置 (niebloid)  | 
| 
 (C++20) 
 | 
确定两个元素范围是否是相同的 (niebloid)  | 
| 
 (C++20) 
 | 
当一个范围按字典顺序小于另一个范围时,返回 true (niebloid)  | 
| 
 (C++20)(C++20)(C++20) 
 | 
查找满足特定条件的的第一个元素 (niebloid)  | 
| 
 (C++23)(C++23)(C++23) 
 | 
查找满足特定条件的最后一个元素 (niebloid)  | 
| 
 (C++20) 
 | 
查找特定范围中最后出现的元素序列 (niebloid)  | 
| 
 (C++20) 
 | 
查找范围中的任一元素 (niebloid)  | 
| 
 (C++20) 
 | 
查找首对相邻的相同(或满足给定谓词的)元素 (niebloid)  | 
| 
 (C++20) 
 | 
搜索一个元素范围的首次出现 (niebloid)  | 
| 
 (C++20) 
 | 
在范围中搜索首次出现某个元素的一定量连续副本 (niebloid)  | 
| 
 (C++23)(C++23) 
 | 
检查范围是否包含给定的元素或子范围 (niebloid)  | 
| 
 (C++23) 
 | 
检查一个范围是否始于另一范围 (niebloid)  | 
| 
 (C++23) 
 | 
检查一个范围是否终于另一范围 (niebloid)  | 
修改序列的操作 | 
|
| 
 (C++20)(C++20) 
 | 
将某一范围的元素复制到一个新的位置 (niebloid)  | 
| 
 (C++20) 
 | 
将一定数目的元素复制到一个新的位置 (niebloid)  | 
| 
 (C++20) 
 | 
按从后往前的顺序复制一个范围内的元素 (niebloid)  | 
| 
 (C++20) 
 | 
将某一范围的元素移动到一个新的位置 (niebloid)  | 
| 
 (C++20) 
 | 
按从后往前的顺序移动某一范围的元素到新的位置 (niebloid)  | 
| 
 (C++20) 
 | 
以特定值向范围的各元素赋值 (niebloid)  | 
| 
 (C++20) 
 | 
将一个值复制赋值给一定量的元素 (niebloid)  | 
| 
 (C++20) 
 | 
将一个函数应用于某一范围的各个元素 (niebloid)  | 
| 
 (C++20) 
 | 
保存函数结果到一个范围中 (niebloid)  | 
| 
 (C++20) 
 | 
保存 N 次函数应用的结果 (niebloid)  | 
| 
 (C++20)(C++20) 
 | 
移除满足特定判别标准的元素 (niebloid)  | 
| 
 (C++20)(C++20) 
 | 
复制一个范围的元素,忽略满足特定判别标准的元素 (niebloid)  | 
| 
 (C++20)(C++20) 
 | 
将所有满足特定判别标准的值替换为另一个值 (niebloid)  | 
| 
 (C++20)(C++20) 
 | 
复制一个范围内的元素,并将满足特定判别标准的元素替换为另一个值 (niebloid)  | 
| 
 (C++20) 
 | 
交换两个范围的元素 (niebloid)  | 
| 
 (C++20) 
 | 
逆转范围中的元素顺序 (niebloid)  | 
| 
 (C++20) 
 | 
创建一个范围的逆向副本 (niebloid)  | 
| 
 (C++20) 
 | 
旋转范围中的元素顺序 (niebloid)  | 
| 
 (C++20) 
 | 
复制并旋转元素范围 (niebloid)  | 
| 
 (C++20) 
 | 
随机重排范围中的元素 (niebloid)  | 
| 迁移范围中的元素 (niebloid)  | 
|
| 
 (C++20) 
 | 
从序列中随机选择 n 个元素 (niebloid)  | 
| 
 (C++20) 
 | 
移除范围中的连续重复元素 (niebloid)  | 
| 
 (C++20) 
 | 
创建某范围的不含连续重复元素的副本 (niebloid)  | 
划分操作 | 
|
| 
 (C++20) 
 | 
判断范围是否已按给定的谓词划分 (niebloid)  | 
| 
 (C++20) 
 | 
将范围中的元素分为二组 (niebloid)  | 
| 
 (C++20) 
 | 
复制一个范围,将各元素分为二组 (niebloid)  | 
| 
 (C++20) 
 | 
将元素分成二组,同时保持其相对顺序 (niebloid)  | 
| 
 (C++20) 
 | 
定位已划分范围的划分点 (niebloid)  | 
排序操作 | 
|
| 
 (C++20) 
 | 
检查范围是否以升序排序 (niebloid)  | 
| 
 (C++20) 
 | 
寻找最大的有序子范围 (niebloid)  | 
| 
 (C++20) 
 | 
将范围按升序排序 (niebloid)  | 
| 
 (C++20) 
 | 
排序一个范围的前 N 个元素 (niebloid)  | 
| 
 (C++20) 
 | 
对范围内的元素进行复制并部分排序 (niebloid)  | 
| 
 (C++20) 
 | 
将范围内的元素排序,同时保持相等的元素之间的顺序 (niebloid)  | 
| 
 (C++20) 
 | 
将给定的范围部分排序,确保其按给定元素划分 (niebloid)  | 
二分搜索操作(在有序范围上) | 
|
| 
 (C++20) 
 | 
返回指向首个不小于给定值的元素的迭代器 (niebloid)  | 
| 
 (C++20) 
 | 
返回指向首个大于某值的元素的迭代器 (niebloid)  | 
| 
 (C++20) 
 | 
确定元素是否存在于某范围中 (niebloid)  | 
| 
 (C++20) 
 | 
返回匹配特定键的元素范围 (niebloid)  | 
集合操作(在有序范围上) | 
|
| 
 (C++20) 
 | 
归并两个有序范围 (niebloid)  | 
| 
 (C++20) 
 | 
在原位归并两个有序范围 (niebloid)  | 
| 
 (C++20) 
 | 
若一个序列是另一个的子列则返回 true (niebloid)  | 
| 
 (C++20) 
 | 
计算两个集合的差集 (niebloid)  | 
| 
 (C++20) 
 | 
计算两个集合的交集 (niebloid)  | 
| 
 (C++20) 
 | 
计算两个集合的对称差 (niebloid)  | 
| 
 (C++20) 
 | 
计算两个集合的并集 (niebloid)  | 
堆操作 | 
|
| 
 (C++20) 
 | 
检查给定范围是否为最大堆 (niebloid)  | 
| 
 (C++20) 
 | 
寻找能成为最大堆的最大子范围 (niebloid)  | 
| 
 (C++20) 
 | 
从一个元素范围创建出一个最大堆 (niebloid)  | 
| 
 (C++20) 
 | 
将一个元素加入到一个最大堆 (niebloid)  | 
| 
 (C++20) 
 | 
从最大堆中移除最大元素 (niebloid)  | 
| 
 (C++20) 
 | 
将一个最大堆变成一个按升序排序的元素范围 (niebloid)  | 
最小/最大操作 | 
|
| 
 (C++20) 
 | 
返回给定值的较大者 (niebloid)  | 
| 
 (C++20) 
 | 
返回范围中的最大元素 (niebloid)  | 
| 
 (C++20) 
 | 
返回给定值的较小者 (niebloid)  | 
| 
 (C++20) 
 | 
返回范围中的最小元素 (niebloid)  | 
| 
 (C++20) 
 | 
返回两个元素的较小和较大者 (niebloid)  | 
| 
 (C++20) 
 | 
返回范围中的最小和最大元素 (niebloid)  | 
| 
 (C++20) 
 | 
在一对边界值间夹一个值 (niebloid)  | 
排列操作 | 
|
| 
 (C++20) 
 | 
确定一个序列是否为另一序列的排列 (niebloid)  | 
| 
 (C++20) 
 | 
产生某个元素范围的按字典序下一个较大的排列 (niebloid)  | 
| 
 (C++20) 
 | 
产生某个元素范围的按字典序下一个较小的排列 (niebloid)  | 
受约束的数值操作
| 
 在标头  
<numeric> 定义 | 
|
| 
 在命名空间  
std::ranges 定义 | 
|
| 
 (C++23) 
 | 
用从起始值开始连续递增的值填充一个范围 (niebloid)  | 
受约束的折叠操作
| 
 在标头  
<algorithm> 定义 | 
|
| 
 在命名空间  
std::ranges 定义 | 
|
| 
 (C++23) 
 | 
左折叠范围内的元素 (niebloid)  | 
| 
 (C++23) 
 | 
用第一个元素作为初始值左折叠范围内的元素 (niebloid)  | 
| 
 (C++23) 
 | 
右折叠范围内的元素 (niebloid)  | 
| 
 (C++23) 
 | 
使用最后一个元素的值为初始值右折叠范围内的元素 (niebloid)  | 
| 
 (C++23) 
 | 
左折叠范围内的元素,并且返回 一对(迭代器,值) (niebloid)  | 
| 用第一个元素作为初始值左折叠范围内的元素并返回一对(迭代器,可选值) (niebloid)  | 
|
受约束的未初始化内存算法
| 
 在标头  
<memory> 定义 | 
|
| 
 在命名空间  
std::ranges 定义 | 
|
| 
 (C++20) 
 | 
复制元素范围到未初始化的内存区域 (niebloid)  | 
| 
 (C++20) 
 | 
复制一定量元素到未初始化的内存区域 (niebloid)  | 
| 
 (C++20) 
 | 
复制一个对象到范围所定义的未初始化的内存区域 (niebloid)  | 
| 
 (C++20) 
 | 
复制一个对象到起始与计数所定义的未初始化的内存区域 (niebloid)  | 
| 
 (C++20) 
 | 
移动对象范围到未初始化的内存区域 (niebloid)  | 
| 
 (C++20) 
 | 
移动一定量对象到未初始化的内存区域 (niebloid)  | 
| 在范围所定义的未初始化的内存区域以默认初始化构造对象 (niebloid)  | 
|
| 在起始与计数所定义的未初始化的内存区域以默认初始化构造对象 (niebloid)  | 
|
| 在范围所定义的未初始化的内存区域以值初始化构造对象 (niebloid)  | 
|
| 在起始与计数所定义的未初始化的内存区域以值初始化构造对象 (niebloid)  | 
|
| 
 (C++20) 
 | 
销毁范围中的元素 (niebloid)  | 
| 
 (C++20) 
 | 
销毁范围中一定量的元素 (niebloid)  | 
| 
 (C++20) 
 | 
销毁位于给定地址的元素 (niebloid)  | 
| 
 (C++20) 
 | 
在给定地址创建对象 (niebloid)  | 
受约束的随机数算法
| 
 在标头  
<random> 定义 | 
|
| 
 在命名空间  
std::ranges 定义 | 
|
| 
 (C++26) 
 | 
用来自均匀随机位发生器的随机数填充范围 (niebloid)  | 
返回类型
| 
 在标头  
<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 fold algorithms | 
__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 |