命名空间
变体
操作

std::ranges::views::counted

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

    requires /* see below */

constexpr /*span-or-subrange*/ counted( Iterator&& it, DifferenceType&& count );
(C++20 起)

counted 视图呈现一个视图,该视图包含计数范围 [in) 的元素,其中 i 是某个迭代器,n 是非负整数。

计数范围 [in) 是指从迭代器 i 指向的元素开始,到但不包括通过 n 次应用 ++i 操作得到的迭代器所指向的元素(如果有)为止的 n 个元素。

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

形式上,如果 itcount 是表达式,Tstd::decay_t<decltype((it))>Dstd::iter_difference_t<T>,则

如果 T 建模 input_or_output_iterator 并且 decltype((count)) 建模 std::convertible_to<D>
否则,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 建模

否则,__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
(类模板) [编辑]
迭代器适配器,用于跟踪到范围末尾的距离
(类模板) [编辑]
返回满足特定条件的元素数量
(算法函数对象)[编辑]