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

来自cppreference.com
< cpp‎ | algorithm


 
 
算法库
受约束算法及范围上的算法 (C++20)
包含算法例如 ranges::copy, ranges::sort, ...
执行策略 (C++17)
排序和相关操作
划分操作
排序操作
二分搜索操作(在已划分范围上)
集合操作(在有序范围上)
归并操作(在有序范围上)
堆操作
最小/最大操作
(C++11)
(C++17)
字典序比较操作
排列操作
C 库

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

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

算法函数对象

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

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

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

受约束算法

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
不修改序列的操作
检查谓词是否对范围中所有、任一或无元素为 true
(算法函数对象)
应用一元函数对象范围中元素
(算法函数对象)
应用函数对象到序列的前 N 个元素
(算法函数对象)
返回满足特定条件的元素数目
(算法函数对象)
查找两个范围的首个不同之处
(算法函数对象)
判断两组元素是否相同
(算法函数对象)
当一个范围字典序小于另一个时返回 true
(算法函数对象)
查找首个满足特定条件的元素
(算法函数对象)
查找最后一个满足特定条件的元素
(算法函数对象)
查找元素序列在特定范围中最后一次出现
(算法函数对象)
搜索一组元素中任一元素
(算法函数对象)
查找首对相同(或满足给定谓词)的相邻元素
(算法函数对象)
搜索元素范围的首次出现
(算法函数对象)
搜索元素在范围中首次连续若干次出现
(算法函数对象)
检查范围是否包含给定元素或子范围
(算法函数对象)
检查一个范围是否始于另一范围
(算法函数对象)
检查一个范围是否终于另一范围
(算法函数对象)
修改序列的操作
复制范围中元素到新位置
(算法函数对象)
复制若干元素到新位置
(算法函数对象)
从后往前复制范围中元素
(算法函数对象)
将范围中元素移到新位置
(算法函数对象)
从后往前将范围中元素移到新位置
(算法函数对象)
赋给定值到范围中元素
(算法函数对象)
赋给定值到若干元素
(算法函数对象)
应用函数到元素范围
(算法函数对象)
将函数结果保存到范围中
(算法函数对象)
保存 N 次函数应用的结果
(算法函数对象)
移除满足特定条件的元素
(算法函数对象)
复制范围并忽略满足特定条件的元素
(算法函数对象)
替换所有满足特定条件的值为另一个值
(算法函数对象)
复制范围,并将满足特定条件的元素替换为另一个值
(算法函数对象)
交换两个范围的元素
(算法函数对象)
逆转范围中的元素顺序
(算法函数对象)
创建范围的逆向副本
(算法函数对象)
旋转范围中的元素顺序
(算法函数对象)
复制并旋转元素范围
(算法函数对象)
随机重排范围中元素
(算法函数对象)
迁移范围中元素
(算法函数对象)
从序列中随机选择 N 个元素
(算法函数对象)
移除范围中连续重复元素
(算法函数对象)
创建某范围的不含连续重复元素的副本
(算法函数对象)
划分操作
判断范围是否已按给定谓词划分
(算法函数对象)
将范围中元素分为两组
(算法函数对象)
复制范围并将元素分为两组
(算法函数对象)
将元素分为两组,同时保留其相对顺序
(算法函数对象)
定位已划分范围的划分点
(算法函数对象)
排序操作
检查范围是否已按升序排列
(算法函数对象)
找出最大的有序子范围
(算法函数对象)
将范围按升序排序
(算法函数对象)
将范围中前 N 个元素排序
(算法函数对象)
复制范围中元素并部分排序
(算法函数对象)
将范围中元素排序,同时保持相等元之间的顺序
(算法函数对象)
将给定范围部分排序,确保其按给定元素划分
(算法函数对象)
二分搜索操作(在有序范围上)
返回首个不小于 给定值的元素的迭代器
(算法函数对象)
返回首个大于 给定值的元素的迭代器
(算法函数对象)
判断元素是否在偏序范围中
(算法函数对象)
返回匹配特定键值的元素范围
(算法函数对象)
集合操作(在有序范围上)
合并两个有序范围
(算法函数对象)
就地合并两个有序范围
(算法函数对象)
当一个序列是另一个的子序列时返回 true
(算法函数对象)
计算两个集合的差集
(算法函数对象)
计算两个集合的交集
(算法函数对象)
计算两个集合的对称差
(算法函数对象)
计算两个集合的并集
(算法函数对象)
堆操作
检查给定范围是否为最大堆
(算法函数对象)
查找能成为最大堆的最大子范围
(算法函数对象)
从元素范围创建最大堆
(算法函数对象)
添加元素到最大堆
(算法函数对象)
移除最大堆中最大元
(算法函数对象)
将最大堆变成按升序排序的元素范围
(算法函数对象)
最小/最大操作
返回给定值中较大者
(算法函数对象)
返回范围中最大元
(算法函数对象)
返回给定值中较小者
(算法函数对象)
返回范围中最小元
(算法函数对象)
返回两个元素间的较小者和较大者
(算法函数对象)
返回范围中的最小元和最大元
(算法函数对象)
在一对边界值下夹逼一个值
(算法函数对象)
排列操作
判断一个序列是否为另一个序列的排列
(算法函数对象)
生成元素范围的下一个字典序更大的排列
(算法函数对象)
生成元素范围的下一个字典序更小的排列
(算法函数对象)

受约束的数值操作

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

受约束的折叠操作

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
左折叠范围中元素
(算法函数对象)
以首元素为初值左折叠范围中元素
(算法函数对象)
右折叠范围中元素
(算法函数对象)
以末元素为初值右折叠范围中元素
(算法函数对象)
左折叠范围中元素,并返回 pair(迭代器,值)
(算法函数对象)
以首元素为初值左折叠范围中元素,并返回 pair(迭代器,optional
(算法函数对象)

受约束的未初始化内存算法

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

受约束的随机数算法

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

返回类型

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

注解

功能特性测试标准功能特性
__cpp_lib_algorithm_default_value_type202403L(C++26)算法的列表初始化
__cpp_lib_ranges201911L(C++20)范围库受约束算法
__cpp_lib_ranges_contains202207L(C++23)std::ranges::contains
__cpp_lib_ranges_find_last202207L(C++23)std::ranges::find_last
__cpp_lib_ranges_fold202207L(C++23)std::ranges fold algorithms
__cpp_lib_ranges_iota202202L(C++23)std::ranges::iota
__cpp_lib_ranges_starts_ends_with202106L(C++23)std::ranges::starts_with, std::ranges::ends_with
__cpp_lib_shift201806L(C++20)std::shift_left, std::shift_right
202202L(C++23)std::ranges::shift_left, std::ranges::shift_right
__cpp_lib_ranges_generate_random202403L(C++26)std::ranges::generate_random

缺陷报告

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

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