命名空间
变体
操作

std::ranges::views::counted

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

    requires /* 见下文 */

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

一个 counted 视图表示从迭代器 `i` 和非负整数 `n` 开始的 *计数值域* `[i, n)` 的元素 `view`

一个计数值域 `[i, n)` 是从 `i` 指向的元素开始,不包括(如果有的话)经过 `n` 次 ++i 操作后指向的元素的 `n` 个元素。

如果 n == 0,计数值域有效且为空。否则,计数值域只有在 `n` 为正数,`i` 可解引用,并且 `[++i, --n)` 是一个有效计数值域时才有效。

形式上,如果 itcount 是表达式,`T` 是 std::decay_t<decltype((it))>,且 `D` 是 std::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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
P2393R1 C++20 从整数类类型到 std::size_t 的隐式转换可能无效 改为 explicit

[编辑] 另请参阅

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