std::input_iterator_tag, std::output_iterator_tag, std::forward_iterator_tag, std::bidirectional_iterator_tag, std::random_access_iterator_tag, std::contiguous_iterator_tag
提供: cppreference.com
| ヘッダ <iterator> で定義
|
||
| struct input_iterator_tag { }; |
||
| struct output_iterator_tag { }; |
||
| struct forward_iterator_tag : public input_iterator_tag { }; |
||
| struct bidirectional_iterator_tag : public forward_iterator_tag { }; |
||
| struct random_access_iterator_tag : public bidirectional_iterator_tag { }; |
||
| struct contiguous_iterator_tag: public random_access_iterator_tag { }; |
(C++20以上) | |
イテレータのカテゴリを定義します。 それぞれのタグは空の型であり、5 (C++20未満)6 (C++20以上)つのイテレータカテゴリのひとつに対応します。
-
input_iterator_tagは LegacyInputIterator に対応します。 -
output_iterator_tagは LegacyOutputIterator に対応します。 -
forward_iterator_tagは LegacyForwardIterator に対応します。 -
bidirectional_iterator_tagは LegacyBidirectionalIterator に対応します。 -
random_access_iterator_tagは LegacyRandomAccessIterator に対応します。
|
(C++20以上) |
イテレータカテゴリタグは、そのカテゴリが暗に示す特定の要件の集合に対して最も効率的なアルゴリズムを選択するために使用できる情報を持ちます。
すべてのイテレータ型 It について、 typedef std::iterator_traits<It>::iterator_category が利用可能です。 これは、これら5 (C++20未満)6 (C++20以上)つのタグ型のひとつのエイリアスになります。
|
さらに、イテレータコンセプトへの準拠を示すために std::iterator_traits<It>::iterator_concept が使用されることがあります。 |
(C++20以上) |
ノートLegacyContiguousIterator のための別個のタグはありません。 |
(C++17以上) (C++20未満) |
[編集] 例
イテレータカテゴリタグに基づくアルゴリズム選択の一般的なテクニックは、ディスパッチャ関数を使用することです (別の方法としては std::enable_if もあります)。
Run this code
#include <iostream> #include <vector> #include <list> #include <iterator> template< class BDIter > void alg(BDIter, BDIter, std::bidirectional_iterator_tag) { std::cout << "alg() called for bidirectional iterator\n"; } template <class RAIter> void alg(RAIter, RAIter, std::random_access_iterator_tag) { std::cout << "alg() called for random-access iterator\n"; } template< class Iter > void alg(Iter first, Iter last) { alg(first, last, typename std::iterator_traits<Iter>::iterator_category()); } int main() { std::vector<int> v; alg(v.begin(), v.end()); std::list<int> l; alg(l.begin(), l.end()); // std::istreambuf_iterator<char> i1(std::cin), i2; // alg(i1, i2); // compile error: no matching function for call }
出力:
alg() called for random-access iterator alg() called for bidirectional iterator
[編集] 関連項目
| (C++17で非推奨) |
シンプルなイテレータのための型要件の定義を簡単にする基底クラス (クラステンプレート) |
| イテレータの性質への統一されたインタフェースを提供します (クラステンプレート) |

