Namespaces
Variants

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

来自 zh.cppreference.net
 
 
算法库
约束算法与范围算法 (C++20)
约束算法,例如 ranges::copy、ranges::sort……
排序及相关操作
划分操作
(C++11)    

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


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

C++20 在命名空间 约束版本的算法。在这些算法中,范围可以指定为 std::ranges迭代器-哨位对,或单个 范围参数,并支持投影和指向成员的可调用对象。此外,大多数算法的 返回类型已更改,以返回算法执行期间计算出的所有可能有用信息。

算法函数对象

一个算法函数对象(Algorithm Function Object, AFO),非正式地称为niebloid ,是一个定制点对象(Customization Point Object, CPO),其被指定为一个或多个重载的函数模板。这些函数模板的名称用于指代相应的算法函数对象。

对于一个算法函数对象o,令S为相应的函数模板集合。那么对于任何参数序列args...,o(args...)与是表达式等价s(args...)的,其中对s的名字查找结果为重载集合S。

命名空间std::ranges中受约束的算法被定义为算法函数对象。因此:

范围参数

一些重载接受 范围 参数,它们的行为如同通过分派到命名空间 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 折叠算法
__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被允许指定为
除函数对象外的特殊实体
要求被指定
作为函数对象