Namespaces
Variants

std:: counted_iterator

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
ヘッダーで定義 <iterator>
template < std:: input_or_output_iterator I >
class counted_iterator ;
(C++20以降)

std::counted_iterator は、基盤となるイテレータとまったく同じように動作するイテレータアダプタですが、範囲の終端までの距離を追跡する点が異なります。このイテレータは、カウントがゼロに達した場合にのみ std::default_sentinel と等しくなります。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Member types、Member objects、Member functions、Non-member functions、Helper classes、Example、Defect reports、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、IDなどはすべて変更せず保持しました - 数値や構造は完全に維持しました

メンバー型

メンバー型 定義
iterator_type I
value_type
(条件付きで存在)
std:: iter_value_t < I > I indirectly_readable をモデル化する場合; それ以外の場合、定義されない
difference_type std:: iter_difference_t < I >
iterator_concept
(条件付きで存在)
I :: iterator_concept 存在する場合; それ以外の場合、定義されない
iterator_category
(条件付きで存在)
I :: iterator_category 存在する場合; それ以外の場合、定義されない

メンバーオブジェクト

メンバー名 定義
current (private) base() がアクセスする基盤となるイテレータ
( 説明専用メンバーオブジェクト* )
length (private) 基盤となるイテレータとその範囲の終端との間の距離
( 説明専用メンバーオブジェクト* )

メンバー関数

新しい counted_iterator を構築する
(public member function)
別の counted_iterator を代入する
(public member function)
基盤となるイテレータにアクセスする
(public member function)
終端までの距離を返す
(public member function)
指し示す要素にアクセスする
(public member function)
インデックスによる要素へのアクセス
(public member function)
counted_iterator を進める、または戻す
(public member function)

非メンバー関数

終端までの距離を比較する
(関数テンプレート)
終端までの距離が ​0​ と等しいかどうかをチェックする
(関数テンプレート)
(C++20)
イテレータを進める
(関数テンプレート)
(C++20)
2つのイテレータアダプタ間の距離を計算する
(関数テンプレート)
終端までの符号付き距離を計算する
(関数テンプレート)
(C++20)
基盤となるイテレータの間接参照結果を、関連する右辺値参照型にキャストする
(関数)
(C++20)
2つの基盤となるイテレータが指すオブジェクトを交換する
(関数テンプレート)

ヘルパークラス

std::counted_iterator 型のプロパティに対する統一インターフェースを提供する
(クラステンプレートの特殊化)

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
using std::operator""s;
void print(auto const remark, auto const& v)
{
    const auto size = std::ssize(v);
    std::cout << remark << '[' << size << "] { ";
    for (auto it = std::counted_iterator{std::cbegin(v), size};
         it != std::default_sentinel; ++it)
        std::cout << *it << (it.count() > 1 ? ", " : " ");
    std::cout << "}\n";
}
int main()
{
    const auto src = {"Arcturus"s, "Betelgeuse"s, "Canopus"s, "Deneb"s, "Elnath"s};
    print("src", src);
    std::vector<decltype(src)::value_type> dst;
    std::ranges::copy(std::counted_iterator{src.begin(), 3},
                      std::default_sentinel,
                      std::back_inserter(dst));
    print("dst", dst);
}

出力:

src[5] { Arcturus, Betelgeuse, Canopus, Deneb, Elnath }
dst[3] { Arcturus, Betelgeuse, Canopus }

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
P2259R1 C++20 メンバーtypedefが提供されていない std::incrementable_traits
counted_iterator に対して特殊化されている
メンバーtypedefが追加され、 iterator_traits の修正に対応
冗長な std::incrementable_traits の特殊化が削除される

関連項目

範囲の境界を知っているイテレータで使用するデフォルトセンチネル
(クラス)
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト)
別の view の最初のN個の要素からなる view
(クラステンプレート) (レンジアダプタオブジェクト)