目录
前言
在vector和list的接口中我们实际上有说明过反向迭代器的用法,这里就有个问题,并不是只有这两个容器存在反向迭代器的。那么对于他们底层的实现我们是不是每个容器都写一个反向迭代器?
其实不是的,实际上不管你是什么容器,每个容器的反向迭代器实现的逻辑都大差不差,每一个容器都实现一段几乎相同的代码,多少有点费时费力,所以在STL库里就实现了一个适合所有具有迭代器的容器的反向迭代器!也就是迭代器适配器(和stack、queue一样的概念),你传入什么容器的正向迭代器,编译器就会适配出什么样的反向迭代器,本质是对正向迭代器的一种封装!!!!
一、反向迭代器接口(用户层)
这里在复习一下两个接口:
rbegin()+rend()
rbegin():返回最后一个 元素的反向迭代器,即正向迭代器end的前一个位置。
rend():返回第一个元素之前理论元素的反向迭代器,即正向迭代器begin的前一个位置。
从上面的叙述中不难猜测出:对反向迭代器的++,实际上就是对正向迭代器的--!!
二、模拟实现
有了前面的铺垫这里直接上代码!!注意:这里的模板参数在和list的迭代器类是一样的
cpp
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)
{}
//*it
Ref operator*()
{
Iterator tmp = _it;
return *(--tmp);
}
//it->
Ptr operator->()
{
//复用解引用
return &(operator*());
}
//++it
self& operator++()
{
--_it;//实际上这里调用正向迭代器,即:--end
return *this;
}
//--it
self& 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也是类似的写法,因为上面的模拟实现的反向迭代器是适合所有容器的反向迭代器,只要你有正向迭代器,传进来就能适配!!
cpp
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;
}
// ...
}
}
四、总结
①反向迭代器实际上是一个适配器,也叫迭代器适配器,适合所有容器。它实际上都是在调用对应的正向迭代器进行操作,反向的++,就是调用正向的--!
②反向迭代器本质就是对正向迭代器的一种封装!
希望今天的内容对你有帮助,感谢你的观看!!