C++ STL迭代器分类


一、迭代器基础

迭代器的作用是可以在不了解容器内部原理的情况下遍历容器,同时作为容器和STL算法之间的桥梁。

二、STL迭代器的分类

迭代器本身是一个类对象,类别标签如下:

  1. struct input_iterator_tag{};
  2. struct output_iterator_tag{};
  3. struct forward_iterator_tag : public input_iterator_tag{}
    仅支持单向移动
  4. struct bidirectional_iterator_tag : public forward_iterator_tag{};
    支持正向和反向移动,不支持跳跃随机移动
  5. struct random_access_iterator_tag : public bidirectional_iterator_tag{};
    支持正向和反向移动,也支持跳跃随机移动
    注意其中部分类型的继承关系:
    在这里插入图片描述

三、STL容器与迭代器

容器与支持的迭代器对应关系如下:

迭代器分类容器
random_access_iterator_tagvector、deque
forward_iterator_tagforward_list、unordered_map、unordered_set、unordered_multimap、unordered_multiset
bidirectional_iterator_taglist、map、set、multimap、multiset

此外,stack、queue、priority_queue不支持迭代器。

四、STL算法与迭代器

  1. 部分STL算法隐含对迭代器类型的要求,如sort函数的声明如下:
template <class RandomAccessIterator>
void sort(RandomAccessIterator fist, RandomAccessIterator last);

要求传入的迭代器类型必须是random access类型的迭代器。

  1. 部分算法采用函数重载方法实现,当传入算法的迭代器类型不同可能造成算法的性能差异,以advance函数为例:
//重载函数1
void _advance(InputIterator& i, Distance n, input_iterator_tag){...}  //忽略具体实现
//重载函数2
void _advance(InputIterator& i, Distance n, bidirectional_iterator_tag){...}
//重载函数3
void _advance(InputIterator& i, Distance n, random_access_iterator_tag){...}

void advance(InputIterator& i, Distance n){
	_advance(i, n, iterator_category(i));    //根据参数三的类型决定调用上述哪个重载函数
}

此外,上述三个重载函数没有属于forward_iterator_tag类型的迭代器的版本,但注意继承关系,forward_iterator_tag类型继承自input_iterator_tag类型,因此当传入forward_iterator_tag类型迭代器的时候会调用重载函数1.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值