名前空間
変種
操作

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
< cpp‎ | iterator
 
 
イテレータライブラリ
イテレータコンセプト
イテレータプリミティブ
input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagcontiguous_iterator_tag
(C++20)
(C++17で非推奨)
イテレータアダプタ
ストリームイテレータ
イテレータのカスタマイゼーションポイント
イテレータ操作
(C++11)
(C++11)
範囲アクセス
(C++11)(C++14)
(C++11)(C++14)
(C++17)(C++20)
(C++14)(C++14)
(C++14)(C++14)
(C++17)
(C++17)
 
ヘッダ <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以上)つのイテレータカテゴリのひとつに対応します。

(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 もあります)。

#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で非推奨)
シンプルなイテレータのための型要件の定義を簡単にする基底クラス
(クラステンプレート) [edit]
イテレータの性質への統一されたインタフェースを提供します
(クラステンプレート) [edit]