std::input_iterator_tag,std::output_iterator_tag,std::forward_iterator_tag, (3) - Linux Manuals

std::input_iterator_tag,std::output_iterator_tag,std::forward_iterator_tag,: std::input_iterator_tag,std::output_iterator_tag,std::forward_iterator_tag,


std::input_iterator_tag,std::output_iterator_tag,std::forward_iterator_tag, - std::input_iterator_tag,std::output_iterator_tag,std::forward_iterator_tag,



Defined in header <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    (since C++20)

Defines the category of an iterator. Each tag is an empty type and corresponds to
one of the
(until C++20)
(since C++20) iterator categories:

  input_iterator_tag corresponds to LegacyInputIterator.
  output_iterator_tag corresponds to LegacyOutputIterator.
  forward_iterator_tag corresponds to LegacyForwardIterator.
  bidirectional_iterator_tag corresponds to LegacyBidirectionalIterator.
  random_access_iterator_tag corresponds to LegacyRandomAccessIterator.

  contiguous_iterator_tag corresponds to LegacyContiguousIterator.   (since C++20)

Iterator category tags carry information that can be used to select the most
efficient algorithms for the specific requirement set that is implied by the

For every iterator type It, a typedef std::iterator_traits<It>::iterator_category is
available, which is an alias to one of these
(until C++20)
(since C++20) tag types.

Additionally, std::iterator_traits<It>::iterator_concept may be used   (since C++20)
to indicate conformance to the iterator concepts.

  Notes                                                (since C++17)
                                                 (until C++20)
There is no separate tag for LegacyContiguousIterator.


Common technique for algorithm selection based on iterator category tags is to use a
dispatcher function (the alternative is 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

See also

iterator              base class to ease the definition of required types for simple
(deprecated in C++17) iterators
                (class template)
iterator_traits       provides uniform interface to the properties of an iterator
                (class template)