命名空间
变体
操作

std::ranges::views::counted

来自 cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
定义于头文件 <ranges>
inline constexpr /*未指定*/ counted = /*未指定*/;
(自 C++20)
调用签名
template< class Iterator, class DifferenceType >

    requires /*见下文*/

constexpr /*跨度或子范围*/ counted( Iterator&& it, DifferenceType&& count );
(自 C++20)

一个 counted 视图呈现了一个对计数范围[in)中元素的view,对于某个迭代器i和非负整数n

计数范围[in)是从i指向的元素开始的n个元素,直到但不包括n次应用++i的结果(如果有)指向的元素。

如果n == 0,则计数范围有效且为空。否则,只有当n为正数,i可解引用且[++i--n)是一个有效的计数范围时,计数范围才是有效的。

正式地,如果itcount是表达式,Tstd::decay_t<decltype((it))>Dstd::iter_difference_t<T>,那么

如果T模拟input_or_output_iteratordecltype((count))模拟std::convertible_to<D>
否则,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模拟

否则,__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 的隐式转换可能无效 已明确

[编辑] 另请参见

一个包含另一个 view 的前 N 个元素的 view
(类模板) (范围适配器对象)[编辑]
将迭代器-哨兵对组合成一个 view
(类模板) [编辑]
跟踪到范围末尾的距离的迭代器适配器
(类模板) [编辑]
返回满足特定条件的元素数量
(非阻塞函数对象)[编辑]