1、概述
STL中的算法是独立于容器的,但是它可以通过迭代器iterators对容器进行操作,当容器的迭代器能回答算法的提问时,该容器才能搭配算法的所有操作。而从语言层面上说,算法Algorithm,是一个函数模板function template。
2、G2.9迭代器的分类
1)迭代器的分类有5种
- input_iterator_tag
- farward_iterator_tag
- bidirectional_iterator_tag
- random_access_iterator_tag
- output_iterator_tag
解析:
a、random_access_tag是代表迭代器可以跳转,如ite+=5。一般是用于序列式容器如:array、vector、deque;
b、bidirectional_iterator_tag是代表迭代器是双向链表类型,如list、rb_tree、set、map;
c、farward_iterator_tag是代表迭代器是单向链表类型,如farward_list、hashtable、unordered_set、unordered_map;
d、input_iterator_tag代表是istream_iterator类型;
e、output_iterator_tag代表是ostream_iterator类型;
2)它们之间的关系如下,除了output_iterator_tag外,其它是继承关系
3、不同容器的迭代器分类验证
1)STL中容器包括序列式容器和关联式容器中的迭代器分类验证如下
解析:图1中列举了不同类型的容器,然后使用函数传入参数迭代器对象,然后会输出相应迭代器分类。图2就是打印输出的迭代器分类名称,与图1一一对应。我们可以
知道不同类型容器中的迭代器分类。当然也可以通过typeid()函数进行验证,如下:
vector<int> v;
cout << typeid(v.begin()).name() << endl;
2)了解istream_iterator的迭代器分类
解析:通过G2.9中对istream_iterator的typedef定义可以,它的迭代器类型是input_iterator_tag。同理ostream_iterator中的是output_iterator_tag类型。
3、迭代器类型对算法的影响
下面将举例说明不同迭代器类型是如何影响算法的。
1)算法distance的结构
解析:
a、STL中算法distance功能是求得两个迭代器间的距离。通过传入参数两个需要计算距离的迭代器;
b、当对不同的容器使用distance算法的时候,diatance()函数会根据迭代器的类型category来调用不同的_distance()函数,正是此处发挥了迭代器分类对算法影响的
功能。
2)调用函数_distance()的不同重载函数
解析:
a、_distance有两个重载函数,分别对应传入迭代器类型是input_iterator_tag和random_access_iterator_tag;
b、当传入容器迭代器是random_access_iterator_tag时,如array容器,直接进行last-first操作就能完成求距离的功能;
c、当传入容器不是random_access_iterator_tag时,求距离时要进行分布迭加,这样效率就会慢很多;
d、这边只重载了两种迭代器类型,因为迭代器分类是继承结构,而input_iterator_tag是最高父类,所以传入的不同迭代器类型都能调用它。
4、算法源码中对iterator_category的暗示
解析:
a、在算法中函数参数传入类型是模板类型,但是会用名称提示你,对于所要求的迭代器的分类类型,如distance需要InputIterator。
b、如果你传入不同类型的迭代器,声明不会报错。但在使用过程中会出现错误。