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
<tbody> </tbody>
| ヘッダ |
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
(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 に対応します。
イテレータカテゴリタグは、そのカテゴリが暗に示す特定の要件の集合に対して最も効率的なアルゴリズムを選択するために使用できる情報を持ちます。
すべてのイテレータ型 It について、 typedef std::iterator_traits<It>::iterator_category が利用可能です。 これは、これら5 (C++20未満)6 (C++20以上)つのタグ型のひとつのエイリアスになります。
|
さらに、イテレータコンセプトへの準拠を示すために |
(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