std::ranges::views::counted
定义于头文件 <ranges> |
||
inline constexpr /*unspecified*/ counted = /*unspecified*/; |
(C++20 起) | |
调用签名 |
||
template< class Iterator, class DifferenceType > requires /* see below */ |
(C++20 起) | |
counted 视图呈现一个视图,该视图包含计数范围 [
i,
n)
的元素,其中 i
是某个迭代器,n
是非负整数。
计数范围 [
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++ 标准。
DR | 应用于 | 发布行为 | 正确行为 |
---|---|---|---|
P2393R1 | C++20 | 从整数类类型到 std::size_t 的隐式转换可能无效 | 已显式化 |
[编辑] 参见
(C++20) |
一个由另一个 view 的前 N 个元素组成的 view (类模板) (范围适配器对象) |
(C++20) |
将迭代器-哨兵对组合成一个 view (类模板) |
(C++20) |
迭代器适配器,用于跟踪到范围末尾的距离 (类模板) |
(C++20)(C++20) |
返回满足特定条件的元素数量 (算法函数对象) |