std::counted_iterator
From cppreference.com
| ヘッダ <iterator> で定義 |
||
| template< std::input_or_output_iterator I > class counted_iterator; |
(C++20以降) | |
std::counted_iteratorは、イテレータの範囲の末尾までの距離を追跡することを除けば、基底イテレータとまったく同じように動作するイテレータアダプタである。このイテレータは、そのカウントがゼロになった場合にのみstd::default_sentinelと等しくなる。
目次 |
[編集] メンバ型
| メンバ型 | 定義 |
iterator_type
|
I
|
value_type(条件付きで存在) |
Iがindirectly_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) |
[編集] 非メンバ関数
| (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_traitscounted_iteratorのために特殊化されている |
iterator_traitsの修正に対応するためにメンバtypedefが追加された 冗長なstd::incrementable_traits特殊化が削除された |
[編集] 関連項目
| (C++20) |
範囲の境界を知っているイテレータと共に使用するためのデフォルトの番兵 (sentinel) (クラス) |
| (C++20) |
イテレータとカウントから部分rangeを作成する (カスタマイゼーションポイントオブジェクト) |
| (C++20) |
別のviewの最初のN個の要素からなる view(クラステンプレート) (rangeアダプタオブジェクト) |