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

本文详细介绍了C++中迭代器的五种分类:输入迭代器、输出迭代器、前向迭代器、双向迭代器及随机访问迭代器,并通过代码示例展示了如何根据不同迭代器类型选择合适的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 
C++
 
 
在头文件  <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 { };
  
     

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

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

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

#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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值