第四章. 迭代器
-
条款26.iterator优先于const_iterator、reverse_iterator及const_reverse_iterator
先说这四种迭代器各自的功能
对iterator进行递增可以从容器头部遍历到尾部
对reverse_iterator进行递增则可以从容器尾部遍历到头部
const_iterator和const_reverse_iterator则是对这两种迭代器增加了常量性,不可改变迭代器指向的值
再说它们之间的转换,为了直观一些我做了一张图
这四个迭代器是四个毫无关联的类(!!)。
可以通过隐式转换,将非const转换为const,但const无法直接转换为非const(具体方法见下一条款)。
至于非reverse和reverse之间转换,书上说非reverse可以隐式转换为reverse,但在vs2005的STL实现中,已经由explicit声明为非隐式转换了,需要将iterator传入reverse_iterator的构造函数转换为reverse迭代器。而reverse转换为非reverse则可以通过迭代器调用base()获得。
最后可以说下这个条款了,为什么要优先使用iterator,避免使用其他三个
容器类中的很多成员函数形参类型都是iterator,包括运算符重载函数,传入其他三个无法隐式转换为iterator类型的迭代器,将无法通过编译。而且混用不同类型迭代器,将导致模板函数在类型推导时产生意料之外的编译问题。
-
条款27.使用distance和advance将容器的const_iterator转换成iterator
上一条款中提到,const_iterator
无法直接转换为iterator
。
如果想要转换,可以创建一个新的iterator
,先将它指向begin()
,然后计算const_iterator
和begin(
)之间的距离,再将新的迭代器移动相应距离,即可获得一个和const_iterator
指向相同对象的iterator
。
想法很简单很直接,实现通过distance()
和advance()
这两个函数
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);
一长串的返回值可以忽略,这个函数返回两个迭代器之间的距离
template <class InputIterator, class Distance>
void advance (InputIterator& it, Distance n);
将迭代器移动n个距离
一起使用:
const_iterator const_it = vec.begin();
...//经过某些操作
iterator it = vec.begin();
advance(it, distance<const_iterator>(it, const_it));
ps.因为distance()
进行类型推导时,迭代器实参需要类型一致,所以通过<const_iterator>
指定模板推导类型,iterator
隐式转换为const_iterator
-
条款28.正确理解由reverse_iterator的base()成员函数所产生的iterator的用法
如有错误,欢迎指正
网友评论