算法库

来自cppreference.com
< cpp


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

数值运算
(C++11)                       
在未初始化内存上的操作
 

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意,范围定义为 [firstlast),其中 last 指代要查询或修改的最后元素的后一个 元素。

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

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

std::vector<int> v{7, 1, 4, 0, -1};
std::ranges::sort(v); // 受约束算法

执行策略 (C++17 起)

大多数算法拥有接受执行策略的重载。标准库的算法支持几种执行策略,库中提供了相应的执行策略类型和对象。用户可以通过以对应类型的执行策略对象为参数调用并行算法,静态地选择执行策略。

标准库实现(但不是用户)可以定义额外的执行策略作为扩展。以实现定义类型的执行策略对象调用并行算法的语义是由实现定义的。

允许算法的并行版本(除了 std::for_eachstd::for_each_n)从范围进行任意的元素复制,只要 std::is_trivially_copy_constructible_v<T>std::is_trivially_destructible_v<T> 都是 true,其中 T 是元素的类型。

在标头 <execution> 定义
在命名空间 std::execution 定义
执行策略类型
(类)
(C++17)(C++17)(C++17)(C++20)
全局执行策略对象
(常量)
在命名空间 std 定义
测试类是否表示某种执行策略
(类模板)
功能特性测试标准功能特性
__cpp_lib_parallel_algorithm201603L(C++17)并行算法
__cpp_lib_execution201603L(C++17)执行策略
201902L(C++20)std::execution::unsequenced_policy

不修改序列的操作

批量操作

在标头 <algorithm> 定义
应用一元函数对象范围中元素
(函数模板)
应用一元函数对象范围中元素
(算法函数对象)
应用函数对象到序列的前 N 个元素
(函数模板)
应用函数对象到序列的前 N 个元素
(算法函数对象)

搜索操作

在标头 <algorithm> 定义
(C++11)(C++11)(C++11)
检查谓词是否对范围中所有、任一或无元素为 true
(函数模板)
检查谓词是否对范围中所有、任一或无元素为 true
(算法函数对象)
检查范围是否包含给定元素或子范围
(算法函数对象)
查找首个满足特定条件的元素
(函数模板)
查找首个满足特定条件的元素
(算法函数对象)
查找最后一个满足特定条件的元素
(算法函数对象)
查找元素序列在特定范围中最后一次出现
(函数模板)
查找元素序列在特定范围中最后一次出现
(算法函数对象)
搜索一组元素中任一元素
(函数模板)
搜索一组元素中任一元素
(算法函数对象)
查找首对相同(或满足给定谓词)的相邻元素
(函数模板)
查找首对相同(或满足给定谓词)的相邻元素
(算法函数对象)
返回满足特定条件的元素数目
(函数模板)
返回满足特定条件的元素数目
(算法函数对象)
查找两个范围的首个不同之处
(函数模板)
查找两个范围的首个不同之处
(算法函数对象)
判断两组元素是否相同
(函数模板)
判断两组元素是否相同
(算法函数对象)
搜索元素范围的首次出现
(函数模板)
搜索元素范围的首次出现
(算法函数对象)
搜索元素在范围中首次连续若干次出现
(函数模板)
搜索元素在范围中首次连续若干次出现
(算法函数对象)
检查一个范围是否始于另一范围
(算法函数对象)
检查一个范围是否终于另一范围
(算法函数对象)

折叠操作 (C++23 起)

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

修改序列的操作

复制操作

在标头 <algorithm> 定义
复制范围中元素到新位置
(函数模板)
复制范围中元素到新位置
(算法函数对象)
(C++11)
复制若干元素到新位置
(函数模板)
复制若干元素到新位置
(算法函数对象)
从后往前复制范围中元素
(函数模板)
从后往前复制范围中元素
(算法函数对象)
(C++11)
将范围中元素移到新位置
(函数模板)
将范围中元素移到新位置
(算法函数对象)
从后往前将范围中元素移到新位置
(函数模板)
从后往前将范围中元素移到新位置
(算法函数对象)

交换操作

在标头 <algorithm> 定义   (C++11 前)
在标头 <utility> 定义     (C++11 起)
在标头 <string_view> 定义
交换两个对象的值
(函数模板)
在标头 <algorithm> 定义
交换两个范围的元素
(函数模板)
交换两个范围的元素
(算法函数对象)
交换两个迭代器所指向的元素
(函数模板)

变换操作

在标头 <algorithm> 定义
应用函数到元素范围,并在目标范围存储结果
(函数模板)
应用函数到元素范围
(算法函数对象)
替换所有满足特定条件的值为另一个值
(函数模板)
替换所有满足特定条件的值为另一个值
(算法函数对象)
复制范围,并将满足特定条件的元素替换为另一个值
(函数模板)
复制范围,并将满足特定条件的元素替换为另一个值
(算法函数对象)

生成操作

在标头 <algorithm> 定义
以复制的方式赋给定值到范围中所有元素
(函数模板)
赋给定值到范围中元素
(算法函数对象)
以复制的方式赋给定值到范围中 N 个元素
(函数模板)
赋给定值到若干元素
(算法函数对象)
赋连续函数调用结果到范围中所有元素
(函数模板)
将函数结果保存到范围中
(算法函数对象)
赋连续函数调用结果到范围中 N 个元素
(函数模板)
保存 N 次函数应用的结果
(算法函数对象)

移除操作

在标头 <algorithm> 定义
移除满足特定条件的元素
(函数模板)
移除满足特定条件的元素
(算法函数对象)
复制范围并忽略满足特定条件的元素
(函数模板)
复制范围并忽略满足特定条件的元素
(算法函数对象)
移除范围中连续重复元素
(函数模板)
移除范围中连续重复元素
(算法函数对象)
创建某范围的不含连续重复元素的副本
(函数模板)
创建某范围的不含连续重复元素的副本
(算法函数对象)

顺序变更操作

在标头 <algorithm> 定义
逆转范围中的元素顺序
(函数模板)
逆转范围中的元素顺序
(算法函数对象)
创建范围的逆向副本
(函数模板)
创建范围的逆向副本
(算法函数对象)
旋转范围中的元素顺序
(函数模板)
旋转范围中的元素顺序
(算法函数对象)
复制并旋转元素范围
(函数模板)
复制并旋转元素范围
(算法函数对象)
迁移范围中元素
(函数模板)
迁移范围中元素
(算法函数对象)
(C++17 前)(C++11)
随机重排范围中元素
(函数模板)
随机重排范围中元素
(算法函数对象)

采样操作

在标头 <algorithm> 定义
(C++17)
从序列中随机选择 N 个元素
(函数模板)
从序列中随机选择 N 个元素
(算法函数对象)

排序和相关操作

要求

部分算法要求由实参表示的序列“已排序”或“已划分”。未满足要求时行为未定义。

序列在满足以下条件时已按比较器 comp 排序:对于指向序列中的每个迭代器 iter 和每个非负整数 n,如果 iter + n[1] 是一个指向序列中的某个元素的有效迭代器,那么 comp(*(iter + n), *iter) == false[1]

(C++20 前)

序列在满足以下条件时已按比较器 comp 和投影 proj 排序:对于指向序列中的每个迭代器 iter 和每个非负整数 n,如果 iter + n[1] 是一个指向序列中的某个元素的有效迭代器,那么 bool(std::invoke(comp, std::invoke(proj, *(iter + n)),
                       std::invoke(proj, *iter)))
[1]false

序列在满足以下条件时已按比较器 comp 排序:该序列已按比较器 comp 和投影 std::identity{}(即投影到自身)排序。

(C++20 起)

序列 [startfinish) 在满足以下条件时已按表达式 f(e) 划分:存在一个整数 n,使得对于 [0std::distance(start, finish)) 中的所有整数 if(*(start + i))[1] 当且仅当 i < n 时是 true

  1. 1.0 1.1 1.2 1.3 1.4 在这里 iter + n 只表示 “iter 自增 n 次后的结果”,而 iter 本身不需要是随机访问迭代器。

划分操作

在标头 <algorithm> 定义
判断范围是否已按给定谓词划分
(函数模板)
判断范围是否已按给定谓词划分
(算法函数对象)
将范围中元素分为两组
(函数模板)
将范围中元素分为两组
(算法函数对象)
复制范围并将元素分为两组
(函数模板)
复制范围并将元素分为两组
(算法函数对象)
将元素分为两组,同时保留其相对顺序
(函数模板)
将元素分为两组,同时保留其相对顺序
(算法函数对象)
定位已划分范围的划分点
(函数模板)
定位已划分范围的划分点
(算法函数对象)

排序操作

在标头 <algorithm> 定义
将范围按升序排序
(函数模板)
将范围按升序排序
(算法函数对象)
将范围中元素排序,同时保持相等元之间的顺序
(函数模板)
将范围中元素排序,同时保持相等元之间的顺序
(算法函数对象)
将范围中前 N 个元素排序
(函数模板)
将范围中前 N 个元素排序
(算法函数对象)
复制范围中元素并部分排序
(函数模板)
复制范围中元素并部分排序
(算法函数对象)
(C++11)
检查范围是否已按升序排列
(函数模板)
检查范围是否已按升序排列
(算法函数对象)
找出最大的有序子范围
(函数模板)
找出最大的有序子范围
(算法函数对象)
将给定范围部分排序,确保其按给定元素划分
(函数模板)
将给定范围部分排序,确保其按给定元素划分
(算法函数对象)

二分搜索操作(在已划分范围上)

在标头 <algorithm> 定义
返回首个不小于 给定值的元素的迭代器
(函数模板)
返回首个不小于 给定值的元素的迭代器
(算法函数对象)
返回首个大于 给定值的元素的迭代器
(函数模板)
返回首个大于 给定值的元素的迭代器
(算法函数对象)
返回匹配特定键值的元素范围
(函数模板)
返回匹配特定键值的元素范围
(算法函数对象)
判断元素是否在偏序范围中
(函数模板)
判断元素是否在偏序范围中
(算法函数对象)

集合操作(在已排序范围上)

在标头 <algorithm> 定义
当一个序列是另一个的子序列时返回 true
(函数模板)
当一个序列是另一个的子序列时返回 true
(算法函数对象)
计算两个集合的并集
(函数模板)
计算两个集合的并集
(算法函数对象)
计算两个集合的交集
(函数模板)
计算两个集合的交集
(算法函数对象)
计算两个集合的差集
(函数模板)
计算两个集合的差集
(算法函数对象)
计算两个集合的对称差
(函数模板)
计算两个集合的对称差
(算法函数对象)

归并操作(在已排序范围上)

在标头 <algorithm> 定义
合并两个有序范围
(函数模板)
合并两个有序范围
(算法函数对象)
就地合并两个有序范围
(函数模板)
就地合并两个有序范围
(算法函数对象)

堆操作

随机访问范围 [firstlast) 在满足以下条件时是一个关于比较器 comp 的堆:对于 (0last - first) 中的所有整数 ibool(comp(first[(i - 1) / 2], first[i])) 都是 false

(C++20 前)

随机访问范围 [firstlast) 在满足以下条件时是一个关于比较器 comp 和投影 proj 的堆:对于 (0last - first) 中的所有整数 ibool(std::invoke(comp, std::invoke(proj, first[(i - 1) / 2]),
                       std::invoke(proj, first[i]))
都是 false

随机访问范围 [firstlast) 在满足以下条件时是一个关于比较器 comp 的堆:该范围是一个关于 compstd::identity{}(即投影到自身)的堆。

(C++20 起)

可以通过 std::make_heapranges::make_heap(C++20 起) 创建堆。

关于堆的更多性质,可以参考最大堆


在标头 <algorithm> 定义
添加元素到最大堆
(函数模板)
添加元素到最大堆
(算法函数对象)
移除最大堆中最大元
(函数模板)
移除最大堆中最大元
(算法函数对象)
从元素范围创建最大堆
(函数模板)
从元素范围创建最大堆
(算法函数对象)
将最大堆变成按升序排序的元素范围
(函数模板)
将最大堆变成按升序排序的元素范围
(算法函数对象)
检查给定范围是否为最大堆
(函数模板)
检查给定范围是否为最大堆
(算法函数对象)
查找能成为最大堆的最大子范围
(函数模板)
查找能成为最大堆的最大子范围
(算法函数对象)

最小/最大操作

在标头 <algorithm> 定义
返回给定值中较大者
(函数模板)
返回给定值中较大者
(算法函数对象)
返回范围中最大元
(函数模板)
返回范围中最大元
(算法函数对象)
返回给定值中较小者
(函数模板)
返回给定值中较小者
(算法函数对象)
返回范围中最小元
(函数模板)
返回范围中最小元
(算法函数对象)
(C++11)
返回两个元素间的较小者和较大者
(函数模板)
返回两个元素间的较小者和较大者
(算法函数对象)
返回范围中的最小元和最大元
(函数模板)
返回范围中的最小元和最大元
(算法函数对象)
(C++17)
在一对边界值下夹逼一个值
(函数模板)
在一对边界值下夹逼一个值
(算法函数对象)

字典序比较操作

在标头 <algorithm> 定义
当一个范围字典序小于另一个时返回 true
(函数模板)
当一个范围字典序小于另一个时返回 true
(算法函数对象)
三路比较两个范围
(函数模板)

排列操作

在标头 <algorithm> 定义
生成元素范围的下一个字典序更大的排列
(函数模板)
生成元素范围的下一个字典序更大的排列
(算法函数对象)
生成元素范围的下一个字典序更小的排列
(函数模板)
生成元素范围的下一个字典序更小的排列
(算法函数对象)
判断一个序列是否为另一个序列的排列
(函数模板)
判断一个序列是否为另一个序列的排列
(算法函数对象)

数值运算

在标头 <numeric> 定义
(C++11)
从初始值开始连续递增填充范围
(函数模板)
从初始值开始连续递增填充范围
(算法函数对象)
求和或折叠范围中元素
(函数模板)
计算两个范围中元素的内积
(函数模板)
计算范围中相邻元素的差
(函数模板)
计算范围中元素的部分和
(函数模板)
(C++17)
类似 std::accumulate,但不依序执行
(函数模板)
类似 std::partial_sum,第 i 个和中排除第 i 个输入
(函数模板)
类似 std::partial_sum,第 i 个和中包含第 i 个输入
(函数模板)
应用可调用对象,然后乱序规约
(函数模板)
应用可调用对象,然后计算排除扫描
(函数模板)
应用可调用对象,然后计算包含扫描
(函数模板)

在未初始化内存上的操作

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

随机数生成 (C++26 起)

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

注解

功能特性测试标准功能特性
__cpp_lib_algorithm_iterator_requirements202207L(C++23)对非范围算法使用范围迭代器
__cpp_lib_clamp201603L(C++17)std::clamp
__cpp_lib_constexpr_algorithms201806L(C++20)constexpr 算法
202306L(C++26)constexpr 稳定排序
__cpp_lib_algorithm_default_value_type202403L(C++26)算法的列表初始化
__cpp_lib_freestanding_algorithm202311L(C++26)<algorithm> 中的独立设施
__cpp_lib_robust_nonmodifying_seq_ops201304L(C++14)使不修改序列的操作更健壮(std::mismatchstd::equalstd::is_permutation 的两个范围重载)
__cpp_lib_sample201603L(C++17)std::sample
__cpp_lib_shift201806L(C++20)std::shift_leftstd::shift_right

C 库

在标头 <cstdlib> 定义
对未指定类型的元素范围排序
(函数)
在未指定类型的数组中搜索元素
(函数)

缺陷报告

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

缺陷报告应用于出版时的行为正确行为
LWG 193C++98堆要求 *first 是最大的元素可以有等于 *first 的元素
LWG 2150C++98已排序序列的定义不正确已改正
LWG 2166C++98对堆的要求与最大堆的定义不够接近改进要求

参阅

算法C 文档