std::ranges::views::counted
定义于头文件 <ranges> |
||
inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(C++20 起) | |
调用签名 (Call signature) |
||
template< class Iterator, class DifferenceType > requires /* 见下文 */ |
(C++20 起) | |
一个 counted 视图表示从迭代器 `i` 和非负整数 `n` 开始的 *计数值域* `[i, n)` 的元素 `view`。
一个计数值域 `[i, n)` 是从 `i` 指向的元素开始,不包括(如果有的话)经过 `n` 次 ++i 操作后指向的元素的 `n` 个元素。
如果 n == 0,计数值域有效且为空。否则,计数值域只有在 `n` 为正数,`i` 可解引用,并且 `[++i, --n)` 是一个有效计数值域时才有效。
形式上,如果 it 和 count 是表达式,`T` 是 std::decay_t<decltype((it))>,且 `D` 是 std::iter_difference_t<T>,则:
- 如果 `T` 满足 `input_or_output_iterator` 且 decltype((count)) 满足 std::convertible_to<D>,
- 如果 `T` 满足 `contiguous_iterator`,则 views::counted(it, count) 表达式等价于 std::span(std::to_address(it), static_cast<std::size_t>(static_cast<D>(count))),
- 否则,如果 `T` 满足 `random_access_iterator`,则 views::counted(it, count) 表达式等价于 ranges::subrange(it, it + static_cast<D>(count)),
- 否则,views::counted(it, count) 表达式等价于 ranges::subrange(std::counted_iterator(it, count), std::default_sentinel)。
- 否则,views::counted(it, count) 是不合法的。
目录 |
自定义点对象
名称 `views::counted` 表示一个 *定制点对象*,它是一个常量 函数对象,类型为 字面 `semiregular` 类。为便于说明,其类型中 cv 不限定的版本表示为 `__counted_fn`。
`__counted_fn` 的所有实例都是相等的。在相同参数上调用 `__counted_fn` 类型的不同实例的效果是等价的,无论表示实例的表达式是左值还是右值,以及是否带有 const 限定(然而,不要求可调用 volatile 限定的实例)。因此,`views::counted` 可以自由复制,并且其副本可以互换使用。
给定一组类型 `Args...`,如果 std::declval<Args>()... 满足上面 `views::counted` 参数的要求,`__counted_fn` 模型为
- std::invocable<__counted_fn, Args...>,
- std::invocable<const __counted_fn, Args...>,
- std::invocable<__counted_fn&, Args...>,和
- std::invocable<const __counted_fn&, Args...>.
否则,`__counted_fn` 的函数调用运算符不参与重载决议。
[编辑] 注意
`views::counted` 不检查值域是否足够长以提供所有 count 个元素:如果需要此检查,请使用 views::take。
[编辑] 示例
#include <iostream> #include <ranges> int main() { const int a[]{1, 2, 3, 4, 5, 6, 7}; for (int i : std::views::counted(a, 3)) std::cout << i << ' '; std::cout << '\n'; const auto il = {1, 2, 3, 4, 5}; for (int i : std::views::counted(il.begin() + 1, 3)) std::cout << i << ' '; std::cout << '\n'; }
输出
1 2 3 2 3 4
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
P2393R1 | C++20 | 从整数类类型到 std::size_t 的隐式转换可能无效 | 改为 explicit |
[编辑] 另请参阅
(C++20) |
由另一个view 的前N个元素组成的view (类模板) (值域适配器对象) |
(C++20) |
将迭代器-哨兵对组合成view (类模板) |
(C++20) |
跟踪到范围末尾距离的迭代器适配器 (类模板) |
(C++20)(C++20) |
返回满足特定条件的元素数量 (算法函数对象) |