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 /* see below */

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

カウント済みビューは、何らかのイテレータ i と非負整数 n に対する カウント済み範囲 [ i , n ) の要素の view を提示します。

カウントされた範囲 [ i , n ) は、 i が指す要素から始まり、 n 回の ++ i の適用結果が指す要素(存在する場合)を含まない、 n 個の要素を指します。

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 という名前は カスタマイゼーションポイントオブジェクト を表します。これは 関数オブジェクト のconstな リテラル semiregular クラス型です。詳細については CustomizationPointObject を参照してください。

注記

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 Applied to Behavior as published Correct behavior
P2393R1 C++20 整数クラス型から std:: size_t への暗黙変換が無効である可能性がある 明示的に変更

関連項目

別の view の最初のN個の要素からなる view
(クラステンプレート) (レンジアダプタオブジェクト)
イテレータと番兵のペアを view に結合する
(クラステンプレート)
レンジの終端までの距離を追跡するイテレータアダプタ
(クラステンプレート)
特定の条件を満たす要素の数を返す
(アルゴリズム関数オブジェクト)