std::ranges::views::counted
来自 cppreference.com
定义于头文件 <ranges> 中 |
||
inline constexpr /*未指定*/ counted = /*未指定*/; |
(自 C++20) | |
调用签名 |
||
template< class Iterator, class DifferenceType > requires /*见下文*/ |
(自 C++20) | |
一个 counted 视图呈现了一个对计数范围[
i,
n)
中元素的view
,对于某个迭代器i
和非负整数n
。
计数范围[
i,
n)
是从i
指向的元素开始的n
个元素,直到但不包括n
次应用++i的结果(如果有)指向的元素。
如果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
表示一个定制点对象,它是一个const 函数对象,其类型为字面量 semiregular
类类型。为了解释目的,其类型的cv-未限定版本被表示为__counted_fn
。
所有__counted_fn
实例都是相等的。无论表示实例的表达式是左值还是右值,以及是否具有const限定符,在相同参数上调用不同__counted_fn
类型的实例的效果都是等效的(但是,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) |
返回满足特定条件的元素数量 (非阻塞函数对象) |