std::ranges::subrange
来自 cppreference.cn
定义于头文件 <ranges> |
||
template< std::input_or_output_iterator I, |
(1) | (C++20 起) |
辅助概念 |
||
template<class From, class To> concept /*uses-nonqualification-pointer-conversion*/ = |
(2) | (仅作说明*) |
template<class From, class To> concept /*convertible-to-non-slicing*/ = /* see description */; |
(3) | (仅作说明*) |
1) `subrange` 类模板将迭代器和哨兵组合成一个 `view`。当最终模板参数为 `subrange_kind::sized`(当 std::sized_sentinel_for<S, I> 满足或当大小作为构造函数参数显式传递时)时,它建模 `sized_range`。
2) 确定 `From` 是否可以在不进行限定符转换的情况下转换为 `To`。等同于
template<class From, class To> concept /*uses-nonqualification-pointer-conversion*/ = std::is_pointer_v<From> && std::is_pointer_v<To> && !std::convertible_to<std::remove_pointer_t<From>(*)[], std::remove_pointer_t<To>(*)[]>;
3) 确定 `From` 是否可以在不进行派生类到基类转换的情况下转换为 `To`
template<class From, class To> concept /*convertible-to-non-slicing*/ = std::convertible_to<From, To> && !/*uses-nonqualification-pointer-conversion*/ <std::decay_t<From>, std::decay_t<To>>;
目录 |
[编辑] 数据成员
成员 | 定义 |
constexpr bool StoreSize [static] |
K == ranges::subrange_kind::sized && !std::sized_sentinel_for<S, I>(仅用于解释的静态成员常量*) |
I begin_ |
子范围的起始迭代器 (仅用于阐释的成员对象*) |
S end_ |
表示子范围结束的哨兵 (仅用于阐释的成员对象*) |
make-unsigned-like-t <std::iter_difference_t<I>> size_ (仅当 `StoreSize` 为 true 时存在) |
子范围的大小 (仅用于阐释的成员对象*) |
[编辑] 成员函数
创建新的 `subrange` (公开成员函数) | |
将 `subrange` 转换为 pair-like 类型 (public member function) | |
观察器 | |
获取迭代器 (public member function) | |
获取哨兵 (public member function) | |
检查 `subrange` 是否为空 (public member function) | |
获取 `subrange` 的大小 (public member function) | |
迭代器操作 | |
将迭代器按给定距离前进 (public member function) | |
获取 `subrange` 的副本,其迭代器按给定距离递减 (public member function) | |
获取 `subrange` 的副本,其迭代器按给定距离前进 (public member function) | |
继承自 std::ranges::view_interface | |
(C++23) |
返回范围开头的常量迭代器 ( std::ranges::view_interface<D> 的公共成员函数) |
(C++23) |
返回范围常量迭代器的哨兵 ( std::ranges::view_interface<D> 的公共成员函数) |
返回派生视图是否非空,仅当 ranges::empty 适用于它时提供 ( std::ranges::view_interface<D> 的公共成员函数) | |
获取派生视图数据地址,仅当其迭代器类型满足 contiguous_iterator 时提供( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图中的第一个元素,如果它满足 forward_range 则提供( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图的最后一个元素,仅当它满足 `bidirectional_range` 和 `common_range` 时提供 ( std::ranges::view_interface<D> 的公共成员函数) | |
返回派生视图中的第 n 个元素,仅当它满足 random_access_range 时提供( std::ranges::view_interface<D> 的公共成员函数) |
[编辑] 推导指南
[编辑] 非成员函数
(C++20) |
从 std::ranges::subrange 获取迭代器或哨兵 (函数模板) |
[编辑] 辅助类型
(C++20) |
指定 std::ranges::subrange 是否建模 std::ranges::sized_range (枚举) |
获取 std::ranges::subrange 的大小 (类模板特化) | |
获取 std::ranges::subrange 的迭代器或哨兵的类型 (类模板特化) |
[编辑] 辅助模板
template< class I, class S, ranges::subrange_kind K > constexpr bool ranges::enable_borrowed_range<ranges::subrange<I, S, K>> = true; |
(C++20 起) | |
这个 ranges::enable_borrowed_range 的特化使得 `subrange` 满足 `borrowed_range`。
[编辑] 示例
运行此代码
#include <map> #include <print> #include <ranges> void make_uppercase(char& v) { v += 'A' - 'a'; } void uppercase_transform(std::multimap<int, char>& m, int k) { auto [first, last] = m.equal_range(k); for (auto& [_, v] : std::ranges::subrange(first, last)) make_uppercase(v); } int main() { std::multimap<int, char> mm{{4, 'a'}, {3, '-'}, {4, 'b'}, {5, '-'}, {4, 'c'}}; std::println("Before: {}", mm); uppercase_transform(mm, 4); std::println("After: {}", mm); }
输出
Before: {3: '-', 4: 'a', 4: 'b', 4: 'c', 5: '-'} After: {3: '-', 4: 'A', 4: 'B', 4: 'C', 5: '-'}
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 3470 | C++20 | `convertible-to-non-slicing` 可能会拒绝限定符转换 | 总是接受它们 |
[编辑] 另请参阅
(C++20) |
用于使用奇异递归模板模式定义view 的辅助类模板(类模板) |
[编辑] 外部链接
在 C++20 中读取/写入 `std::multimap` 中给定键的所有值 — Stack Overflow |