受约束算法 (自 C++20 起)
来自 cppreference.com
C++20 提供了 受约束的 命名空间 std::ranges
中大多数算法的版本。在这些算法中,范围可以指定为 迭代器-哨兵 对或作为单个 范围
参数,并且支持投影和指向成员的可调用对象。此外,大多数算法的 返回值类型 已更改为返回在算法执行期间计算的所有潜在有用信息。
内容 |
[编辑] 受约束算法
在头文件
<algorithm> 中定义 | |
在命名空间
std::ranges 中定义 | |
非修改序列操作 | |
(C++20)(C++20)(C++20) |
检查谓词是否在范围内的所有元素、任何元素或没有元素中为 true (niebloid) |
(C++20) |
将一个函数应用于一个范围内的元素 (niebloid) |
(C++20) |
将一个函数对象应用于序列的前 N 个元素 (niebloid) |
(C++20)(C++20) |
返回满足特定条件的元素数量 (niebloid) |
(C++20) |
找到两个范围不同的第一个位置 (niebloid) |
(C++20) |
确定两组元素是否相同 (niebloid) |
如果一个范围在字典序上小于另一个范围,则返回 true (niebloid) | |
(C++20)(C++20)(C++20) |
找到满足特定条件的第一个元素 (niebloid) |
(C++23)(C++23)(C++23) |
查找满足特定条件的最后一个元素 (niebloid) |
(C++20) |
在特定范围内查找最后一个元素序列 (niebloid) |
(C++20) |
搜索一组元素中的任何一个 (niebloid) |
(C++20) |
查找第一个相等的两个相邻项(或满足给定谓词的项) (niebloid) |
(C++20) |
搜索元素范围的第一次出现 (niebloid) |
(C++20) |
搜索范围内元素的 N 个连续副本的第一次出现 (niebloid) |
(C++23)(C++23) |
检查范围是否包含给定元素或子范围 (niebloid) |
(C++23) |
检查范围是否以另一个范围开头 (niebloid) |
(C++23) |
检查范围是否以另一个范围结尾 (niebloid) |
修改序列操作 | |
(C++20)(C++20) |
将元素范围复制到新位置 (niebloid) |
(C++20) |
将一定数量的元素复制到新位置 (niebloid) |
(C++20) |
以反向顺序复制元素范围 (niebloid) |
(C++20) |
将元素范围移动到新位置 (niebloid) |
(C++20) |
以反向顺序将元素范围移动到新位置 (niebloid) |
(C++20) |
将元素范围赋予某个值 (niebloid) |
(C++20) |
将值赋予一定数量的元素 (niebloid) |
(C++20) |
将一个函数应用于一个范围内的元素 (niebloid) |
(C++20) |
将函数的结果保存在范围内 (niebloid) |
(C++20) |
保存函数 N 次应用的结果 (niebloid) |
(C++20)(C++20) |
删除满足特定条件的元素 (niebloid) |
(C++20)(C++20) |
复制元素范围,省略满足特定条件的元素 (niebloid) |
(C++20)(C++20) |
将所有满足特定条件的值替换为另一个值 (niebloid) |
(C++20)(C++20) |
复制范围,将满足特定条件的元素替换为另一个值 (niebloid) |
(C++20) |
交换两个元素范围 (niebloid) |
(C++20) |
反转范围中元素的顺序 (niebloid) |
(C++20) |
创建范围的反转副本 (niebloid) |
(C++20) |
旋转范围中元素的顺序 (niebloid) |
(C++20) |
复制并旋转元素范围 (niebloid) |
(C++20) |
随机重新排列范围中的元素 (niebloid) |
移动范围内的元素 (niebloid) | |
(C++20) |
从序列中选择 N 个随机元素 (niebloid) |
(C++20) |
删除范围内的连续重复元素 (niebloid) |
(C++20) |
创建某些元素范围的副本,该副本不包含连续重复项 (niebloid) |
分区操作 | |
(C++20) |
确定范围是否被给定谓词分区 (niebloid) |
(C++20) |
将元素范围划分为两个组 (niebloid) |
(C++20) |
复制范围,将元素划分为两个组 (niebloid) |
(C++20) |
将元素划分为两个组,同时保留它们的相对顺序 (niebloid) |
(C++20) |
定位分区范围的分区点 (niebloid) |
排序操作 | |
(C++20) |
检查范围是否按升序排序 (niebloid) |
(C++20) |
查找最大的排序子范围 (niebloid) |
(C++20) |
将范围按升序排序 (niebloid) |
(C++20) |
对范围的前 N 个元素进行排序 (niebloid) |
(C++20) |
复制并部分排序元素范围 (niebloid) |
(C++20) |
对元素范围进行排序,同时保留相等元素之间的顺序 (niebloid) |
(C++20) |
对给定范围进行部分排序,确保它被给定元素分区 (niebloid) |
二分搜索操作(在排序范围上) | |
(C++20) |
返回指向第一个不小于给定值的元素的迭代器 (niebloid) |
(C++20) |
返回指向第一个大于某个值的元素的迭代器 (niebloid) |
(C++20) |
确定元素是否存在于部分有序范围内 (niebloid) |
(C++20) |
返回与特定键匹配的元素范围 (niebloid) |
集合操作(在排序范围上) | |
(C++20) |
合并两个排序范围 (niebloid) |
(C++20) |
合并两个有序范围,就地执行 (niebloid) |
(C++20) |
如果一个序列是另一个序列的子序列,则返回true (niebloid) |
(C++20) |
计算两个集合之间的差集 (niebloid) |
(C++20) |
计算两个集合的交集 (niebloid) |
计算两个集合的对称差集 (niebloid) | |
(C++20) |
计算两个集合的并集 (niebloid) |
堆操作 | |
(C++20) |
检查给定范围是否为最大堆 (niebloid) |
(C++20) |
找到最大的子范围,该子范围是一个最大堆 (niebloid) |
(C++20) |
从元素范围创建最大堆 (niebloid) |
(C++20) |
将元素添加到最大堆中 (niebloid) |
(C++20) |
从最大堆中删除最大元素 (niebloid) |
(C++20) |
将最大堆转换为按升序排序的元素范围 (niebloid) |
最小/最大操作 | |
(C++20) |
返回给定值中较大的那个 (niebloid) |
(C++20) |
返回范围内最大的元素 (niebloid) |
(C++20) |
返回给定值中较小的那个 (niebloid) |
(C++20) |
返回范围内最小的元素 (niebloid) |
(C++20) |
返回两个元素中较小和较大的那个 (niebloid) |
(C++20) |
返回范围内最小的元素和最大的元素 (niebloid) |
(C++20) |
将值限制在边界值对之间 (niebloid) |
排列操作 | |
(C++20) |
确定序列是否为另一个序列的排列 (niebloid) |
(C++20) |
生成元素范围的下一个更大的字典序排列 (niebloid) |
(C++20) |
生成元素范围的下一个更小的字典序排列 (niebloid) |
[编辑] 受约束的数值运算
定义在头文件
<numeric> 中 | |
在命名空间
std::ranges 中定义 | |
(C++23) |
用起始值的连续增量填充范围 (niebloid) |
[编辑] 受约束的折叠运算
在头文件
<algorithm> 中定义 | |
在命名空间
std::ranges 中定义 | |
(C++23) |
将元素范围从左侧折叠 (niebloid) |
(C++23) |
使用第一个元素作为初始值将元素范围从左侧折叠 (niebloid) |
(C++23) |
将元素范围从右侧折叠 (niebloid) |
(C++23) |
使用最后一个元素作为初始值将元素范围从右侧折叠 (niebloid) |
(C++23) |
将元素范围从左侧折叠,并返回一个对(迭代器,值) (niebloid) |
使用第一个元素作为初始值将元素范围从左侧折叠,并返回一个对(迭代器,可选) (niebloid) |
[编辑] 受约束的未初始化内存算法
定义在头文件
<memory> 中 | |
在命名空间
std::ranges 中定义 | |
(C++20) |
将对象范围复制到内存的未初始化区域 (niebloid) |
(C++20) |
将一定数量的对象复制到内存的未初始化区域 (niebloid) |
(C++20) |
将对象复制到内存的未初始化区域,该区域由范围定义 (niebloid) |
(C++20) |
将对象复制到内存的未初始化区域,该区域由起始位置和计数定义 (niebloid) |
(C++20) |
将对象范围移动到内存的未初始化区域 (niebloid) |
(C++20) |
将一定数量的对象移动到内存的未初始化区域 (niebloid) |
通过默认初始化在内存的未初始化区域中构造对象,该区域由范围定义 (niebloid) | |
在由起始地址和数量定义的未初始化内存区域中,通过默认初始化构造对象。 (niebloid) | |
在由范围定义的未初始化内存区域中,通过值初始化构造对象。 (niebloid) | |
在由起始地址和数量定义的未初始化内存区域中,通过值初始化构造对象。 (niebloid) | |
(C++20) |
销毁一个范围内的对象。 (niebloid) |
(C++20) |
销毁范围内一定数量的对象。 (niebloid) |
(C++20) |
销毁指定地址处的对象。 (niebloid) |
(C++20) |
在指定地址处创建对象。 (niebloid) |
[编辑] 受限随机数算法
定义在头文件
<random> 中 | |
在命名空间
std::ranges 中定义 | |
(C++26) |
用来自均匀随机位生成器的随机数填充一个范围。 (niebloid) |
[编辑] 返回值类型
在头文件
<algorithm> 中定义 | |
在命名空间
std::ranges 中定义 | |
(C++20) |
提供了一种将迭代器和函数对象存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将两个迭代器存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将两个迭代器存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将三个迭代器存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将三个迭代器存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将两个相同类型的值或引用存储为单个单元的方式。 (类模板) |
(C++20) |
提供了一种将迭代器和布尔标志存储为单个单元的方式。 (类模板) |
(C++23) |
提供了一种将迭代器和值存储为单个单元的方式。 (类模板) |
(C++23) |
提供了一种将迭代器和值存储为单个单元的方式。 (类模板) |
[编辑] 备注
功能测试 宏 | 值 | Std | 功能 |
---|---|---|---|
__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 |