受约束算法 (C++20 起)

来自cppreference.com


 
 
算法库
受约束算法及范围上的算法 (C++20)
包含算法例如 ranges::copyranges::sort、...
排序和相关操作
划分操作
(C++11)    

排序操作
二分搜索操作(在已划分范围上)
集合操作(在有序范围上)
归并操作(在有序范围上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比较操作
排列操作




 
受约束算法
本菜单中的所有名字均属于命名空间 std::ranges
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作(在有序范围上)
       
       
集合操作(在有序范围上)
堆操作
最小/最大操作
       
       
排列操作
折叠操作
数值操作
(C++23)            
未初始化存储上的操作
返回类型
 

C++20 在命名空间 std::ranges 中提供大多数算法的受约束版本,可以迭代器-哨位对或单个 range 实参来指定范围,并且支持投影和指向成员指针可调用对象。另外还更改了大多数算法的返回类型,以返回算法执行过程中计算的所有潜在有用信息。

算法函数对象

算法函数对象(AFO),非正式称呼为 niebloid,是定制点对象(CPO),但以一个或多个函数模板重载的方式指定。“函数模板”的名字指代对应的算法函数对象。

对于算法函数对象 o,设 S 为对应的函数模板参数集。那么对于任何参数序列 args...o(args...) 表达式等价s(args...),其中在重载集 S 中查找名字 s

命名空间 std::ranges 中的算法被定义为算法函数对象。结果是:

范围参数

部分重载接收 range 实参,它们的行为如同以分发给命名空间 ranges 中分开接收迭代器和哨位的对应重载来实现,其中对于每个范围实参 r

  • 将对应的迭代器实参以 ranges::begin(r) 初始化。
  • 将对应的哨位实参以 ranges::end(r) 初始化。
(C++26 前)
  • 将对应的哨位实参:
  • ranges::next(ranges::begin(r), ranges::end(r)) 初始化,如果 r 的类型实现了 forward_range 且计算 ranges::next 满足指定的复杂度要求。
  • 否则以 ranges::end(r) 初始化。
(C++26 起)

不修改序列的操作

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
批量操作
应用一元函数对象范围中元素
(算法函数对象) [编辑]
应用函数对象到序列的前 N 个元素
(算法函数对象) [编辑]
搜索操作
检查谓词是否对范围中所有、任一或无元素为 true
(算法函数对象) [编辑]
检查范围是否包含给定元素或子范围
(算法函数对象) [编辑]
查找首个满足特定条件的元素
(算法函数对象) [编辑]
查找最后一个满足特定条件的元素
(算法函数对象) [编辑]
查找元素序列在特定范围中最后一次出现
(算法函数对象) [编辑]
搜索一组元素中任一元素
(算法函数对象) [编辑]
查找首对相同(或满足给定谓词)的相邻元素
(算法函数对象) [编辑]
返回满足特定条件的元素数目
(算法函数对象) [编辑]
查找两个范围的首个不同之处
(算法函数对象) [编辑]
判断两组元素是否相同
(算法函数对象) [编辑]
搜索元素范围的首次出现
(算法函数对象) [编辑]
搜索元素在范围中首次连续若干次出现
(算法函数对象) [编辑]
检查一个范围是否始于另一范围
(算法函数对象) [编辑]
检查一个范围是否终于另一范围
(算法函数对象) [编辑]
折叠操作
左折叠范围中元素
(算法函数对象) [编辑]
以首元素为初值左折叠范围中元素
(算法函数对象) [编辑]
右折叠范围中元素
(算法函数对象) [编辑]
以末元素为初值右折叠范围中元素
(算法函数对象) [编辑]
左折叠范围中元素,并返回 pair(迭代器,值)
(算法函数对象) [编辑]
以首元素为初值左折叠范围中元素,并返回 pair(迭代器,optional
(算法函数对象) [编辑]

修改序列的操作

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
复制操作
复制范围中元素到新位置
(算法函数对象) [编辑]
复制若干元素到新位置
(算法函数对象) [编辑]
从后往前复制范围中元素
(算法函数对象) [编辑]
将范围中元素移到新位置
(算法函数对象) [编辑]
从后往前将范围中元素移到新位置
(算法函数对象) [编辑]
交换操作
交换两个范围的元素
(算法函数对象) [编辑]
变换操作
应用函数到元素范围
(算法函数对象) [编辑]
替换所有满足特定条件的值为另一个值
(算法函数对象) [编辑]
复制范围,并将满足特定条件的元素替换为另一个值
(算法函数对象) [编辑]
生成操作
赋给定值到范围中元素
(算法函数对象) [编辑]
赋给定值到若干元素
(算法函数对象) [编辑]
将函数结果保存到范围中
(算法函数对象) [编辑]
保存 N 次函数应用的结果
(算法函数对象) [编辑]
移除操作
移除满足特定条件的元素
(算法函数对象) [编辑]
复制范围并忽略满足特定条件的元素
(算法函数对象) [编辑]
移除范围中连续重复元素
(算法函数对象) [编辑]
创建某范围的不含连续重复元素的副本
(算法函数对象) [编辑]
顺序变更操作
逆转范围中的元素顺序
(算法函数对象) [编辑]
创建范围的逆向副本
(算法函数对象) [编辑]
旋转范围中的元素顺序
(算法函数对象) [编辑]
复制并旋转元素范围
(算法函数对象) [编辑]
迁移范围中元素
(算法函数对象) [编辑]
随机重排范围中元素
(算法函数对象) [编辑]
采样操作
从序列中随机选择 N 个元素
(算法函数对象) [编辑]

排序和相关操作

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
划分操作
判断范围是否已按给定谓词划分
(算法函数对象) [编辑]
将范围中元素分为两组
(算法函数对象) [编辑]
复制范围并将元素分为两组
(算法函数对象) [编辑]
将元素分为两组,同时保持每组元素的相对顺序
(算法函数对象) [编辑]
定位已划分范围的划分点
(算法函数对象) [编辑]
排序操作
检查范围是否有序
(算法函数对象) [编辑]
找出最大的有序子范围
(算法函数对象) [编辑]
将范围中元素排序
(算法函数对象) [编辑]
将范围中前 N 个元素排序
(算法函数对象) [编辑]
复制范围中元素并部分排序
(算法函数对象) [编辑]
将范围中元素排序,同时保持等价元素之间的相对顺序
(算法函数对象) [编辑]
找出范围如果有序时应在第 N 个的元素
(算法函数对象) [编辑]
二分搜索操作(在已划分范围上)
使用二分搜索查找首个不小于给定值的元素
(算法函数对象) [编辑]
使用二分搜索查找首个大于给定值的元素
(算法函数对象) [编辑]
使用二分搜索判断元素是否在范围中
(算法函数对象) [编辑]
使用二分搜索找出匹配给定值的元素范围
(算法函数对象) [编辑]
集合操作(在已排序范围上)
判断一个序列是否为另一个序列的子序列
(算法函数对象) [编辑]
计算两个集合的差集
(算法函数对象) [编辑]
计算两个集合的交集
(算法函数对象) [编辑]
计算两个集合的对称差
(算法函数对象) [编辑]
计算两个集合的并集
(算法函数对象) [编辑]
归并操作(在已排序范围上)
合并两个有序范围
(算法函数对象) [编辑]
就地合并两个有序范围
(算法函数对象) [编辑]
堆操作
检查给定范围是否为最大堆
(算法函数对象) [编辑]
查找能成为最大堆的最大子范围
(算法函数对象) [编辑]
从元素范围创建最大堆
(算法函数对象) [编辑]
添加元素到最大堆
(算法函数对象) [编辑]
移除最大堆中的最大元素
(算法函数对象) [编辑]
将最大堆变成有序的元素范围
(算法函数对象) [编辑]
最小/最大操作
返回给定值中较大者
(算法函数对象) [编辑]
返回范围中的最大元素
(算法函数对象) [编辑]
返回给定值中较小者
(算法函数对象) [编辑]
返回范围中的最小元素
(算法函数对象) [编辑]
返回两个元素间的较小者和较大者
(算法函数对象) [编辑]
返回范围中的最小元素和最大元素
(算法函数对象) [编辑]
在一对边界值下夹逼一个值
(算法函数对象) [编辑]
字典序比较操作
以字典序比较两个范围
(算法函数对象) [编辑]
排列操作
判断一个序列是否为另一个序列的排列
(算法函数对象) [编辑]
生成元素范围的下一个字典序更大的排列
(算法函数对象) [编辑]
生成元素范围的下一个字典序更小的排列
(算法函数对象) [编辑]

数值运算

在标头 <numeric> 定义
在命名空间 std::ranges 定义
从初始值开始连续递增填充范围
(算法函数对象) [编辑]

<memory> 专门算法

在标头 <memory> 定义
在命名空间 std::ranges 定义
对象(批量)构造
在给定地址创建对象
(算法函数对象) [编辑]
复制范围中对象到未初始化内存
(算法函数对象) [编辑]
复制若干对象到未初始化内存
(算法函数对象) [编辑]
复制一个对象到范围所定义的未初始化内存
(算法函数对象) [编辑]
复制一个对象到起点和数量所定义的未初始化内存
(算法函数对象) [编辑]
移动范围中对象到未初始化内存
(算法函数对象) [编辑]
移动若干对象到未初始化内存
(算法函数对象) [编辑]
在范围所定义的未初始化内存中用默认初始化构造对象
(算法函数对象) [编辑]
在起点和数量所定义的未初始化内存中用默认初始化构造对象
(算法函数对象) [编辑]
在范围所定义的未初始化内存中用值初始化构造对象
(算法函数对象) [编辑]
在起点和数量所定义的未初始化内存中用值初始化构造对象
(算法函数对象) [编辑]
对象(批量)销毁
销毁范围中的对象
(算法函数对象) [编辑]
销毁范围中若干对象
(算法函数对象) [编辑]
销毁给定地址的对象
(算法函数对象) [编辑]

<random> 专门算法

在标头 <random> 定义
在命名空间 std::ranges 定义
用来自均匀随机位发生器的随机数填充范围
(算法函数对象) [编辑]

返回类型

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
提供存储一个迭代器与一个函数对象为单个单元的方式
(类模板) [编辑]
提供存储二个迭代器为单个单元的方式
(类模板) [编辑]
提供存储二个迭代器为单个单元的方式
(类模板) [编辑]
提供存储三个迭代器为单个单元的方式
(类模板) [编辑]
提供存储三个迭代器为单个单元的方式
(类模板) [编辑]
提供存储二个同类型对象或引用为单个单元的方式
(类模板) [编辑]
提供存储一个迭代器与一个布尔标志为单个单元的方式
(类模板) [编辑]
提供储存一个迭代器和一个值为单个单元的方式
(类模板) [编辑]
提供储存一个迭代器和一个值为单个单元的方式
(类模板) [编辑]

注解

功能特性测试 标准 功能特性
__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 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

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
P3136R1 C++20 允许将 niebloids 指定为并非函数对象的特殊实体 要求将之指定为函数对象