名前空間
変種
操作

std::ranges::views::counted

From cppreference.com
< cpp‎ | ranges
 
 
Rangesライブラリ
Rangeアダプタ
 
ヘッダ <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以降)

counted view は、あるイテレータ `i` と非負整数 `n` に対する「counted range」 [in)view を表します。

counted range [in) とは、`i` が指す要素から始まり、`n` 回 ++i を適用した結果が指す要素(もしあれば)の直前までの、`n` 個の要素のことです。

もし n == 0 ならば、counted range は有効で空です。そうでなければ、counted range は `n` が正であり、`i` がデリファレンス可能であり、かつ [++i--n) が有効な counted range である場合にのみ有効です。

形式的には、`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) は ill-formed です。

目次

カスタマイゼーションポイントオブジェクト

views::counted という名前は、customization point object を指します。これは、const で FunctionObject であり、literal かつ semiregular なクラス型です。説明のため、cv-unqualified 版の型は __counted_fn と表記されます。

__counted_fn のすべてのインスタンスは等価です。同じ引数に対して異なるインスタンスの __counted_fn 型を呼び出した際の効果は、インスタンスを表す式が lvalue か rvalue か、また const 修飾されているかどうかに関わらず(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はありません)、等価です。したがって、views::counted は自由にコピーでき、そのコピーは互換性があります。

Args... のセットが与えられたとき、もし std::declval<Args>()... が上記の views::counted への引数の要件を満たすならば、__counted_fn は以下をモデル化します。

それ以外の場合、__counted_fn の関数呼び出し演算子はオーバーロード解決に参加しません。

[編集] 注記

views::counted は、range が `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
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
イテレータと番兵のペアをviewに結合する
(クラステンプレート) [編集]
範囲の終端までの距離を追跡するイテレータアダプタ
(クラステンプレート) [編集]
特定の基準を満たす要素の数を返す
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)