目录
前言
一、反向迭代器接口(用户层)
二、模拟实现
三、以vector模拟实现为例
四、总结
前言
在vector和list的接口中我们实际上有说明过反向迭代器的用法,这里就有个问题,并不是只有这两个容器存在反向迭代器的。那么对于他们底层的实现我们是不是每个容器都写一个反向迭代器?
其实不是的,实际上不管你是什么容器,每个容器的反向迭代器实现的逻辑都大差不差,每一个容器都实现一段几乎相同的代码,多少有点费时费力,所以在STL库里就实现了一个适合所有具有迭代器的容器的反向迭代器!也就是迭代器适配器(和stack、queue一样的概念),你传入什么容器的正向迭代器,编译器就会适配出什么样的反向迭代器,本质是对正向迭代器的一种封装!!!!
一、反向迭代器接口(用户层)
这里在复习一下两个接口:
rbegin()+rend()
rbegin():返回最后一个元素的反向迭代器,即正向迭代器end的前一个位置。
rend():返回第一个元素之前理论元素的反向迭代器,即正向迭代器begin的前一个位置。
从上面的叙述中不难猜测出:对反向迭代器的++,实际上就是对正向迭代器的--!!
二、模拟实现
有了前面的铺垫这里直接上代码!!注意:这里的模板参数在和list的迭代器类是一样的
namespace Re
{// 适配器 -- 复用template<class Iterator, class Ref, class Ptr>class Reverse_iterator{public:typedef Reverse_iterator<Iterator, Ref, Ptr> self;Reverse_iterator(Iterator it):_it(it){}//*itRef operator*(){Iterator tmp = _it;return *(--tmp);}//it->Ptr operator->(){//复用解引用return &(operator*());}//++itself& operator++(){--_it;//实际上这里调用正向迭代器,即:--endreturn *this;}//--itself& operator--(){++_it;return *this;}//it++ ,后置,先返回+之前的结果,所以要返回临时变量,不能引用接收 self operator++(int){Iterator tmp=_it;--_it;return tmp;}self operator--(int){Iterator tmp=_it;++_it;return tmp;}bool operator!=(const self& s){return _it != s._it;}bool operator==(const self& s){return _it == s._it;}private:Iterator _it;};
}
值得一提的是:它的解引用操作实际上是对前一个位置进行解引用,而不是对当前位置进行解引用!!为啥呢?其实STL库里面它真正的底层实现结构是这样的:
每个容器的反向迭代器的构造,都是采用正向迭代器的end()进行构造适配,这么做只是为形成对称结构!!!只不过在用户层,看到的是上面的那两个接口那样:rbegin返回的是最后一个元素的反向迭代器,rend返回的是第一个元素的前一个理论元素的反向迭代器!这实际上也符合迭代器存在的目的:不关心底层具体实现结构,能够采用一种统一的方式去对容器中的数据进行访问!
三、以vector模拟实现为例
这里补充它的迭代器的完整实现,list也是类似的写法,因为上面的模拟实现的反向迭代器是适合所有容器的反向迭代器,只要你有正向迭代器,传进来就能适配!!
namespace Ve
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;// 反向迭代器适配支持typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator; const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}// ...}
}
四、总结
①反向迭代器实际上是一个适配器,也叫迭代器适配器,适合所有容器。它实际上都是在调用对应的正向迭代器进行操作,反向的++,就是调用正向的--!
②反向迭代器本质就是对正向迭代器的一种封装!
希望今天的内容对你有帮助,感谢你的观看!!