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
|
定義先ヘッダ
<iterator>
|
||
|
struct
input_iterator_tag
{
}
;
|
(1) | |
|
struct
output_iterator_tag
{
}
;
|
(2) | |
|
struct
forward_iterator_tag
:
public
input_iterator_tag
{
}
;
|
(3) | |
|
struct
bidirectional_iterator_tag
:
public
forward_iterator_tag
{
}
;
|
(4) | |
|
struct
random_access_iterator_tag
:
public
bidirectional_iterator_tag
{
}
;
|
(5) | |
|
struct
contiguous_iterator_tag
:
public
random_access_iterator_tag
{
}
;
|
(6) | (C++20以降) |
イテレータのカテゴリを定義します。各タグは空の型です。
目次 |
イテレータカテゴリ
すべての
LegacyIterator
型
It
について、
typedef
std::
iterator_traits
<
It
>
::
iterator_category
は、これらのタグ型のいずれかのエイリアスとして定義されなければならず、
It
が属する最も具体的なカテゴリを示す必要があります。
-
input_iterator_tagは LegacyInputIterator に対応します。 -
output_iterator_tagは LegacyOutputIterator に対応します。 -
forward_iterator_tagは LegacyForwardIterator に対応します。 -
bidirectional_iterator_tagは LegacyBidirectionalIterator に対応します。 -
random_access_iterator_tagは LegacyRandomAccessIterator に対応します。
イテレータカテゴリタグは、カテゴリによって示される特定の要件セットに対して最も効率的なアルゴリズムを選択するために使用できる情報を保持します。
Iterator concept
すべての
いずれの場合も、必要な操作がサポートされていない場合、タグに関係なく各コンセプトは満たされない。 |
(C++20以降) |
注記
LegacyContiguousIterator
専用のタグは存在しません。つまり、
iterator_category
に基づいて
LegacyContiguousIterator
を判別することはできません。
連続イテレータ向けの特殊化されたアルゴリズムを定義するには、
contiguous_iterator
コンセプトを使用してください。
(C++20以降)
output_iterator_tag
と
output_iterator
コンセプトの間には対応関係はありません。
iterator_concept
を
output_iterator_tag
に設定することは、
その型が
input_iterator
をモデル化していないことのみを示します。
例
イテレータカテゴリタグに基づくアルゴリズム選択の一般的な手法は、ディスパッチャ関数を使用することです(代替手段は std::enable_if です)。 イテレータタグクラスは、対応するコンセプト定義でも使用され、使用パターンだけでは表現できない要件を示すために用いられます。 (C++20以降)
#include <iostream> #include <iterator> #include <list> #include <vector> // Using concepts (tag checking is part of the concepts themselves) template<std::bidirectional_iterator BDIter> void alg(BDIter, BDIter) { std::cout << "1. alg() \t called for bidirectional iterator\n"; } template<std::random_access_iterator RAIter> void alg(RAIter, RAIter) { std::cout << "2. alg() \t called for random-access iterator\n"; } // Legacy, using tag dispatch namespace legacy { // Quite often implementation details are hidden in a dedicated namespace namespace implementation_details { template<class BDIter> void alg(BDIter, BDIter, std::bidirectional_iterator_tag) { std::cout << "3. legacy::alg() called for bidirectional iterator\n"; } template<class RAIter> void alg(RAIter, RAIter, std::random_access_iterator_tag) { std::cout << "4. legacy::alg() called for random-access iterator\n"; } } // namespace implementation_details template<class Iter> void alg(Iter first, Iter last) { implementation_details::alg(first, last, typename std::iterator_traits<Iter>::iterator_category()); } } // namespace legacy int main() { std::list<int> l; alg(l.begin(), l.end()); // 1. legacy::alg(l.begin(), l.end()); // 3. std::vector<int> v; alg(v.begin(), v.end()); // 2. legacy::alg(v.begin(), v.end()); // 4. // std::istreambuf_iterator<char> i1(std::cin), i2; // alg(i1, i2); // compile error: no matching function for call // legacy::alg(i1, i2); // compile error: no matching function for call }
出力:
1. alg() called for bidirectional iterator 3. legacy::alg() called for bidirectional iterator 2. alg() called for random-access iterator 4. legacy::alg() called for random-access iterator
関連項目
|
(C++17で非推奨)
|
シンプルなイテレータのための必須型定義を容易にする基底クラス
(クラステンプレート) |
|
イテレータのプロパティに対する統一インターフェースを提供する
(クラステンプレート) |