名前空間
変種
操作

std::counted_iterator

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
counted_iterator
(C++20)

Rangeアクセス
(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と等しくなる。

目次

[編集] メンバ型

メンバ型 定義
iterator_type I
value_type
(条件付きで存在)
Iindirectly_readableをモデル化している場合はstd::iter_value_t<I>。そうでない場合は未定義
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 メンバ関数) [編集]
指し示す要素にアクセスする
(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のために特殊化されている
iterator_traitsの修正に対応するためにメンバtypedefが追加された
冗長なstd::incrementable_traits特殊化が削除された

[編集] 関連項目

範囲の境界を知っているイテレータと共に使用するためのデフォルトの番兵 (sentinel)
(クラス) [編集]
イテレータとカウントから部分rangeを作成する
(カスタマイゼーションポイントオブジェクト)[編集]
別のviewの最初のN個の要素からなる view
(クラステンプレート) (rangeアダプタオブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)