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

来自cppreference.com
< cpp‎ | algorithm
 
 
算法库
受约束算法及范围上的算法 (C++20)
受约束算法: std::ranges::copy, std::ranges::sort, ...
执行策略 (C++17)
不修改序列的操作
(C++11)(C++11)(C++11)
(C++17)
修改序列的操作
Partitioning operations
划分操作
排序操作
(C++11)
二分搜索操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)

排列
数值运算
未初始化存储上的操作
(C++17)
(C++17)
(C++17)
C 库
 
受约束算法
不修改序列的操作
修改序列的操作
划分操作
排序操作
二分搜索操作
集合操作(在已排序范围上)
堆操作
最小/最大操作
排列
未初始化存储上的操作
返回类型
 

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

受约束算法

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

受约束的数值操作

在标头 <numeric> 定义
在命名空间 std::ranges 定义
用从起始值开始连续递增的值填充一个范围
(niebloid)

受约束的折叠操作

在标头 <algorithm> 定义
在命名空间 std::ranges 定义
左折叠范围内的元素
(niebloid)
用第一个元素作为初始值左折叠范围内的元素
(niebloid)
右折叠范围内的元素
(niebloid)
使用最后一个元素的值为初始值右折叠范围内的元素
(niebloid)
左折叠范围内的元素,并且返回 pair(迭代器,值)
(niebloid)
用第一个元素作为初始值左折叠范围内的元素并返回 pair(迭代器,optional
(niebloid)

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

在标头 <memory> 定义
在命名空间 std::ranges 定义
复制元素范围到未初始化的内存区域
(niebloid)
复制一定量元素到未初始化的内存区域
(niebloid)
复制一个对象到范围所定义的未初始化的内存区域
(niebloid)
复制一个对象到起始与计数所定义的未初始化的内存区域
(niebloid)
移动对象范围到未初始化的内存区域
(niebloid)
移动一定量对象到未初始化的内存区域
(niebloid)
在范围所定义的未初始化的内存区域以默认初始化构造对象
(niebloid)
在起始与计数所定义的未初始化的内存区域以默认初始化构造对象
(niebloid)
在范围所定义的未初始化的内存区域以值初始化构造对象
(niebloid)
在起始与计数所定义的未初始化的内存区域以值初始化构造对象
(niebloid)
销毁范围中的元素
(niebloid)
销毁范围中一定量的元素
(niebloid)
销毁位于给定地址的元素
(niebloid)
在给定地址创建对象
(niebloid)

返回类型

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

注解

功能特性测试 标准 注释
__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 and std::shift_right
202202L (C++23) std::ranges::shift_left and std::ranges::shift_right