自己做一元夺宝网站,多媒体设计制作公司北京,深圳非凡网站建设公司,上海发布微信公众号目录
前言
反向迭代器的实现 前言
继模拟实现了list和vector之后#xff0c;我们对迭代器的印象也是加深了许多#xff0c;但是我们实现的都是正向迭代器#xff0c;还没有实现反向迭代器#xff0c;那么为什么迟迟不实现呢#xff1f;因为难吗#xff1f;实际上还好。…目录
前言
反向迭代器的实现 前言
继模拟实现了list和vector之后我们对迭代器的印象也是加深了许多但是我们实现的都是正向迭代器还没有实现反向迭代器那么为什么迟迟不实现呢因为难吗实际上还好。
我们实现const迭代器的时候有两种路一是直接来一个类二是通过模板非const迭代器的复用来实现的同理我们实现反向迭代器的话也可以每种结构都来一个单独的反向迭代器的类但是科学家们觉得太麻烦了所以把反向迭代器的高度拉的很高高到什么程度呢高到一个反向迭代器可以适配所有的结构本质上就是复用原来的正向迭代器两种迭代器的区别只是遍历的方向不同而已即变成--源码的实现方式比较复杂我们实现方式是传正向迭代器过来复用对应正向迭代器的函数即可这里就需要单独创建一个类模板了。 反向迭代器的实现
我们大思路是通过判断传的迭代器的不同调用对应正向迭代器的函数所以我们创建的反向迭代器的类的成员变量是iterator实现的接口还是那么几个! * - --
namespace Free
{template class iterator,class Ref,class Ptrstruct ReverseIterator{typedef ReverseIteratoriterator,Ref, Ptr self;ReverseIterator(iterator it):_it(it){}iterator _it;};
}
迭代器其实有个共同的特点就是一般使用struct因为里面的变量函数什么的都是要访问的使用class就麻烦了一点点。
第一个参数是迭代器也就是判断复用谁的迭代器第二个参数是引用第三个参数是指针类型。
这里需要引入一个问题 这是我们没真正接触反向迭代器之前所猜想的反向迭代器结构。
但是源码的操作不是的计算机科学家们可能有点强迫症希望对称。 这是链表中的反向迭代器顺序表同理主打的就是一个对称。 那么这时候的访问就成了问题此时源码的神之一手出现了比如链表rbegin第一次访问的结果应该是5那么我们就来一个临时变量之后(实际上是--)访问到5即可这里是不可以迭代器-1或者迭代器--的因为迭代器本身我们不能破坏但是临时变量却可以随意捣鼓。
template class iterator,class Ref,class Ptr
struct ReverseIterator
{typedef ReverseIteratoriterator,Ref, Ptr self;ReverseIterator(iterator it):_it(it){}Ref operator*(){iterator tmp _it;return *(--tmp);}Ptr operator-(){return (operator*());}self operator(){--_it;return *this;}self operator--(){_it;return *this;}bool operator!(const self s){return _it ! s._it;}iterator _it;
};
这样的一个反向迭代器就算是完成了。 list vector中反向迭代器的应用
注意这里实现的反向迭代器是个简单版本只适用于list和vector。
使用的话加几个typedef 来几个reverse_iterator函数就没问题了比如list
templateclass T
class list
{
public:typedef ListNodeT Node;typedef ListIteratorT,T,T* iterator;typedef ListIteratorT,const T,const T* const_iterator;typedef ReverseIteratoriterator,T,T* reverse_iterator;typedef ReverseIteratorconst_iterator,const T,const T* const_reverse_iterator;reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}
}
依旧不要忘记反向迭代器的核心是复用正向迭代器的函数第一个参数一定是迭代器。
vector:
class vector
{
public:typedef T* iterator;typedef const T* const_iterator;typedef ReverseIteratoriterator, T, T* reverse_iterator;typedef ReverseIteratorconst_iterator, const T, const T* const_reverse_iterator;reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}
}
测试代码
int main()
{Free::listint lt { 1,2,3,4 };Free::listint::reverse_iterator rit lt.rbegin();while (rit ! lt.rend()){cout *rit ;rit;}cout endl;Free::vectorint v { 1,2,3,4 };Free::vectorint::reverse_iterator it v.rbegin();while (it ! v.rend()){cout *it ;it;}return 0;
}
注意前置和后置的使用。 感谢阅读