一、迭代器基础
迭代器的作用是可以在不了解容器内部原理的情况下遍历容器,同时作为容器和STL算法之间的桥梁。
二、STL迭代器的分类
迭代器本身是一个类对象,类别标签如下:
- 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{};
支持正向和反向移动,也支持跳跃随机移动
注意其中部分类型的继承关系:
三、STL容器与迭代器
容器与支持的迭代器对应关系如下:
迭代器分类 | 容器 |
---|---|
random_access_iterator_tag | vector、deque |
forward_iterator_tag | forward_list、unordered_map、unordered_set、unordered_multimap、unordered_multiset |
bidirectional_iterator_tag | list、map、set、multimap、multiset |
此外,stack、queue、priority_queue不支持迭代器。
四、STL算法与迭代器
- 部分STL算法隐含对迭代器类型的要求,如sort函数的声明如下:
template <class RandomAccessIterator>
void sort(RandomAccessIterator fist, RandomAccessIterator last);
要求传入的迭代器类型必须是random access类型的迭代器。
- 部分算法采用函数重载方法实现,当传入算法的迭代器类型不同可能造成算法的性能差异,以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.