目录
一、反向迭代器
之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器
反向迭代器也是适配器(配接器)的一种,反向迭代器的实现是对正向迭代器的封装,即实现的反向迭代器能支持多种容器,给出该容器的正向迭代器就能支持反向迭代器
比如 vector 需要反向迭代器,那就把 vector 的正向迭代器传给 反向迭代器,它就可以通过正向迭代器转换出 vector 的反向迭代器。
也就是说,实现的反向迭代器并包装的这个类,不是针对某个容器而是针对所有容器的,任何一个容器只要你实现了正向迭代器,就可以通过其适配出反向迭代器
要注意反向迭代器的错位访问
对于 list 而言,正向迭代器的 begin 和 end 位置如下
begin 位于头结点的下一个节点,end 则位于尾结点的下一个节点,即头节点,正向迭代器 ++ 操作,迭代器是往后走的
反向迭代器 rbegin 和 rend 位置如下
反向迭代器 rbegin() 位于正向迭代器 end() 的位置, 反向迭代器 rend() 位于正向迭代器 begin() 的位置,反向迭代器 ++操作迭代器是往前走的
vector 反向迭代器也是如此
对于 list 来说,反向迭代器解引用取数据,取的是头节点上一个节点位置的数据,vector 也是如此
二、反向迭代器的实现
Iterator.h
template<classIterator, classRef, classPtr>classReverseIterator{ typedefReverseIterator<Iterator, Ref, Ptr>Self; public: ReverseIterator(Iteratorit) :_it(it) {} Refoperator*() { Iteratortmp=_it; return*(--tmp); //取的是上一个的数据 } Ptroperator->() { return&(operator*());//取的是上一个的数据的地址 } Self&operator++() { --_it; return*this; } Self&operator--() { ++_it; return*this; } booloperator!=(constSelf&s) { return_it!=s._it; } private: Iterator_it; };
下面套到 list 里面进行测试
//反向迭代器typedefReverseIterator<iterator, T&, T*>reverse_iterator; typedefReverseIterator<const_iterator, constT&, constT*>const_reverse_iterator;
在 list 里面添加反向迭代器代码
reverse_iteratorrbegin() { returnreverse_iterator(end()); } reverse_iteratorrend() { returnreverse_iterator(begin()); }
测试代码
voidTest_ReverseIterator() { fy::list<int>lt; lt.push_back(1); lt.push_back(2); lt.push_back(3); lt.push_back(4); lt.push_back(5); lt.push_back(6); fy::list<int>::iteratorit=lt.begin(); while (it!=lt.end()) { cout<<*it<<" "; ++it; } cout<<endl; fy::list<int>::reverse_iteratorrit=lt.rbegin(); while (rit!=lt.rend()) { cout<<*rit<<" "; ++rit; } cout<<endl; }
运行结果
list 的反向迭代器就完成了,下面测试 vector 的反向迭代器
把 Iterotor.h 拷贝一份到 vector 里面
//反向迭代器typedefReverseIterator<iterator, T&, T*>reverse_iterator; typedefReverseIterator<const_iterator, constT&, constT*>const_reverse_iterator;
在 vector 里面添加反向迭代器代码
reverse_iteratorrbegin() { returnreverse_iterator(end()); } reverse_iteratorrend() { returnreverse_iterator(begin()); }
测试代码
voidTest_ReverseIterator() { fy::vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); v.push_back(6); fy::vector<int>::iteratorit=v.begin(); while (it!=v.end()) { cout<<*it<<" "; ++it; } cout<<endl; //反向迭代器fy::vector<int>::reverse_iteratorrit=v.rbegin(); while (rit!=v.rend()) { cout<<*rit<<" "; ++rit; } cout<<endl; }
运行结果
----------------我是分割线---------------
文章到这里就结束了,下一篇即将更新