Namespaces
Variants

std::ranges::views:: counted

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <ranges>
inline constexpr /*unspecified*/ counted = /*unspecified*/ ;
(C++20 起)
调用签名
template < class Iterator, class DifferenceType >

requires /* 见下文 */

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

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

一个计数范围 [ i , n ) 是指从 i 指向的元素开始,连续 n 个元素的序列,包含起始元素但不包含对 i 进行 ++ 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 >
否则, views:: counted ( it, count ) 非良构。

目录

定制点对象

名称 views::counted 表示一个 定制点对象 ,这是一个字面量 semiregular 类类型的常量 函数对象 。详细信息请参阅 定制点对象

注释

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