Namespaces
Variants

Constrained algorithms (since C++20)

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Constrained algorithms
All names in this menu belong to namespace std::ranges
Non-modifying sequence operations
Modifying sequence operations
Partitioning operations
Sorting operations
Binary search operations (on sorted ranges)
Set operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Permutation operations
Fold operations
Operations on uninitialized storage
Return types

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 次出现的元素
(算法函数对象)
检查范围是否包含给定元素或子范围
(算法函数对象)
检查一个范围是否始于另一个范围
(算法函数对象)
检查一个范围是否终于另一个范围
(算法函数对象)

受约束的数值操作

定义于头文件 <numeric>
定义于命名空间 std::ranges
以起始值的连续增量填充范围
(算法函数对象)

受约束折叠操作

定义于头文件 <algorithm>
定义于命名空间 std::ranges
左折叠元素范围
(算法函数对象)
使用首元素作为初始值左折叠元素范围
(算法函数对象)
右折叠元素范围
(算法函数对象)
使用末元素作为初始值右折叠元素范围
(算法函数对象)
左折叠元素范围,并返回 pair (迭代器, 值)
(算法函数对象)
使用首元素作为初始值左折叠元素范围,并返回 pair (迭代器, optional )
(算法函数对象)

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

定义于头文件 <memory>
定义于命名空间 std::ranges
复制对象范围到未初始化的内存区域
(算法函数对象)
复制指定数量的对象到未初始化的内存区域
(算法函数对象)
复制对象到由范围定义的未初始化内存区域
(算法函数对象)
复制对象到由起始点和计数定义的未初始化内存区域
(算法函数对象)
移动对象范围到未初始化的内存区域
(算法函数对象)
移动指定数量的对象到未初始化的内存区域
(算法函数对象)
通过 默认初始化 在由范围定义的未初始化内存区域中构造对象
(算法函数对象)
通过 默认初始化 在由起始点和计数定义的未初始化内存区域中构造对象
(算法函数对象)
通过 值初始化 在由范围定义的未初始化内存区域中构造对象
(算法函数对象)
通过 值初始化 在由起始点和计数定义的未初始化内存区域中构造对象
(算法函数对象)
销毁对象范围
(算法函数对象)
销毁范围内的指定数量的对象
(算法函数对象)
销毁给定地址处的对象
(算法函数对象)
在给定地址处创建对象
(算法函数对象)

受约束的随机数算法

定义于头文件 <random>
定义于命名空间 std::ranges
使用均匀随机位生成器生成的随机数填充范围
(算法函数对象)

返回类型

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

注释

功能测试 标准 功能特性
__cpp_lib_algorithm_default_value_type 202403L (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指定为函数对象以外的特殊实体 必须指定为函数对象