前言
模板进阶也没有到一些特别的东西,就是讲比较偏的一些特性。
在这里我们先来讲一下反向迭代器。
反向迭代器
反向迭代器和正向迭代器的区别
严格来说没有大的区别。真正的区别在于++或者- -的方向不一样。
它是倒着走的。
如果是list, 以我们自己的思路实现我们会怎么做?
我们可能有这样一个思路,我们把正向迭代器拷贝一份出来,名字变一下,其他保持不变。
再把反向迭代器的++变成node =node->prev; 就是增加一个类的思路。
这样行不行呢?我们可以测试一下。
我们再提供一个rbegin(), rend();
最后测试一下
好像还可以,就这么esay.但是还是太年轻太简单了。
我们普通人写的代码,还得看一下高手写的代码,在实践中进步
stl反向迭代器源码
我们看一下stl的源码。
它没有像我们前面一样实现一个类。
它的反向迭代器是这样实现的。
这怎么传了一个正向迭代器过去。
这是个类模板。
还得接着从源码中找。
用适配器。
发现stl极度的讨厌冗余重复的设计。
看源码。
也就是说你用一个正向迭代器就可以构造一个反向迭代器。
然后看这里++就是正向迭代器的- -, - -就是正向迭代器的+ +;
但是这里又有一个诡异的东西。
它的解引用没有取当前位置,它取了前一个位置。
正向和反向的区别来了。
看结构就已经知道为解引用是取前一个位置
反向迭代器模拟实现
现在的思路跟之前不一样了,还是写一个类,但是我现在是用一个正向迭代器取构造一个反向迭代器。
现在重点在于反向迭代器的++是正向迭代器的- -;
template<class Iterator>
struct ReverseIterator
{
typedef ReverseIterator<Iterator> Self;
Iterator _cur;
ReverseIterator(Iterator it)