std:: counted_iterator
From cppreference.net
|
ヘッダーで定義
<iterator>
|
||
|
template
<
std::
input_or_output_iterator
I
>
class counted_iterator ; |
(C++20以降) | |
std::counted_iterator
は、基盤となるイテレータとまったく同じように動作するイテレータアダプタですが、範囲の終端までの距離を追跡する点が異なります。このイテレータは、カウントがゼロに達した場合にのみ
std::default_sentinel
と等しくなります。
目次 |
メンバー型
| メンバー型 | 定義 |
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) |
非メンバー関数
|
(C++20)
|
終端までの距離を比較する
(関数テンプレート) |
終端までの距離が
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 の特殊化が削除される |
関連項目
|
(C++20)
|
範囲の境界を知っているイテレータで使用するデフォルトセンチネル
(クラス) |
|
(C++20)
|
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
別の
view
の最初のN個の要素からなる
view
(クラステンプレート) (レンジアダプタオブジェクト) |