typedef input_iterator_tag iterator_category 这些都是什么意思?

std::input_iterator_tag, std::output_iterator_tag,std::forward_iterator_tag, std::bidirectional_iterator_tag,std::random_access_iterator_tag

 
C++
 
迭代器库
 
在头文件   中定义
   
     
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 { };
   
     

定义迭代器的分类。这些标签都是空的类型,分别对应五种迭代器分类中的一种:

  • input_iterator_tag 对应 InputIterator.
  • output_iterator_tag 对应 OutputIterator.
  • forward_iterator_tag 对应 ForwardIterator.
  • bidirectional_iterator_tag 对应 BidirectionalIterator.
  • random_access_iterator_tag 对应 RandomAccessIterator.

顾名思义,迭代器分类标签可以用以标示某个迭代器的分类,可以根据这一分类所要求的特性来选择最优算法。

每一个迭代器类型都有对应的 std::iterator_traits<Iterator>::iterator_category 类型定义,即这五种类型之一。

#include 
#include 
#include 
#include 
 
template< class BDIter >
void alg(BDIter, BDIter, std::bidirectional_iterator_tag)
{
    std::cout << "alg() called for bidirectional iterator\n";
}
 
template 
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::iterator_category());
}
 
int main()
{
    std::vector v;
    alg(v.begin(), v.end());
 
    std::list l;
    alg(l.begin(), l.end());
 
//    std::istreambuf_iterator i1(std::cin), i2;
//    alg(i1, i2); // compile error: no matching function for call
}

你可能感兴趣的:(STL)