本期主题:STL中反向迭代器的实现
博客主页: 小峰同学
分享小编的在学习到的知识和遇到的问题
小编的能力有限,出现错误希望大家不吝赐
1.反向迭代器
反向迭代器,我们想想,一开始我们正向迭代器,就是用类模板或者直接用原生指针,实现的.
前面我们写过的迭代器拷贝一份,然后++ 变成 -- , -- 变成++ 即可.
我们就会发现,这样实现的时候,每个容器都要去写这样一个东西.代码很冗余.
所以我们就实现一个通用的反向迭代器,就是如果存在正向迭代器,直接适配出我们的反向迭代器.
还有什么别的方法吗?
我们可以直接使用适配器,把正向迭代器,适配为一个反向迭代器.即可.
2.源码
大思路有了,直接上手.
实现过程有解析.
//反向迭代器的适配器 。
namespace zxf
{
//调用的时候,一般都是在别的类内部使用,供别的类调用
//typedef reverse_iterator<iterator> reverse_iterator;
//typedef reverse_iterator<const_iterator> const_reverse_iterator;
//这里就是使用 iterator 适配 reverse_ierator
//使用const_iterator 适配 const_reverse_iterator
template<class iterator, class ref, class ptr>
class reverse_iterator
{
public:
typedef reverse_iterator<iterator, ref, ptr> self;
//迭代器在定义的时候 必须初始化。
reverse_iterator(const iterator it)
:_it(it)//注意只能写在初始化列表中,不能写在函数体内部
//_it是一个正向迭代器,迭代器在创建的时候必须初始化。
{}
self operator++(){
--_it;
return *this;
}
self operator--(){
++_it;
return *this;
}
//iterator也是一个类模板,它是对 pnode(node*)(list就是节点的指针,vector就是元素的指针) 的封装
//iterator知道数据类型,但是reverse_iterator不知道数据类型。
ref operator*(){//这就是为啥要给出第二个模板参数的原因之一:
//我们无法知道iterator类模板成员变量指向的元素的类型,所以要把那个元素的类型传过来。
//另一个原因就是区分开我们的const反向迭代器和正常反向迭代器。
iterator tmp = _it;
return *(--tmp);
//这里'--'的原因就是我们在设置反向迭代器的rbegin() 和 rend()是怎么实现的
//这就是一个边界的问题,和 rbegin() ,rend() 结合看的。
//假如你改变 自己实现的 rbegin() ,rend() 也可以不 '--'。
}
bool operator!=(const self& it)//这里引用可加可不加
{
return _it != (it._it);
}
private:
iterator _it;//底层的正向迭代器。
};
}
3,反向迭代器的意义是什么呢?
重点就是复用,这里的反向迭代器不是针对某一个容器写的,是针所有的容器写的,
只要一个容器有正向迭代器,就一定可以适配出反向迭代器.
代码的复用性很好,是STL中很精华的部分.