一、前言
在最近的几次校招面试中,问道同学用到哪些容器,大多同学都能顺口的回答出来;但是问vector,list和map容器的迭代器类型分别是什么时,同学们似乎都回到到了迭代器的本质上。其实并没这么复杂,如果经常使用STL算法的同学知道,算法是通过迭代器操作容器的元素的,但是不同的算法对迭代器类型是相关要求的,如果不仔细的话,使用就好出现很大的问题。比如:
1 template <class InputIterator, class OutputIterator> 2 OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
std::copy要求的是输入和输出迭代器类型即可
1 template <class BidirectionalIterator1, class BidirectionalIterator2> 2 BidirectionalIterator2 copy_backward (BidirectionalIterator1 first, 3 BidirectionalIterator1 last, 4 BidirectionalIterator2 result)
std::copy_backward则要求是双向迭代器类型。
通过上面的两个例子,主要是考察同学对STL使用的熟练程度如何。
二、STL中容器的迭代器类型
上面就是STL中容器的迭代器类型,以后在使用STL算法前只要清楚容器迭代器类型就可以知道当前容器是否可以正常使用该算法了。其实还有一个input_iterator和output_iterator类型,一般用于输入和输出流中;此处不进行详细介绍。
三、迭代器类型关系
下面是VS2019中STL源码关于各种迭代器类型的继承关系定义,上面各种容器(不包括容器适配器)的迭代器类型都可以在STL源码中查询到。
1 / ITERATOR STUFF (from <iterator>) 2 // ITERATOR TAGS (from <iterator>) 3 struct input_iterator_tag {}; 4 5 struct output_iterator_tag {}; 6 7 struct forward_iterator_tag : input_iterator_tag {}; 8 9 struct bidirectional_iterator_tag : forward_iterator_tag {}; 10 11 struct random_access_iterator_tag : bidirectional_iterator_tag {};
对于std:::copy要求输入迭代器类型,STL容器都适用;但是std::copy_backward算法只能部分容器可以使用。
原文:https://www.cnblogs.com/smartNeo/p/14584280.html