本文之中我们将对反向迭代器进行简要的叙述。
之前在讲解链表的时候我们讲述了在stl链表这个容器中使用的是如下图所示的三个模板参数:
这样就解决了如果需要已经写好了普通迭代器,然后需要编写const迭代器代码冗余的问题。那在这里就会想到,那么反向迭代器与正向迭代器的原理是类似的,那么我们同样可以使用三个模板参数来在list中构建一个反向迭代器。通过查看list的源码,我们发现实际上在其中并没有直接写出反向迭代器的代码,而是使用了一种类模板的结构生成了反向迭代器:
下面我们就来简单的来实现这个反向迭代器:
上面是原代码中的一些内容,可以看到反向迭代器的rebegin()就是正向迭代器的end(),反向的++就是正向的--,但是有一点不同的就是解引用,在解引用中解引用的不是当前值,而是当前位置的前一个位置。
这就是rebegin与end的对应,在源码中为了让代码看上去更加的整齐就是使用了上述解引用的方法。在rebegin = end的时候,通过解引用访问前一个位置的迭代器数据,当rbegin到达1的时候就访问结束了。知道了这些问题就可以来简要的编写一个反向迭代器。
#pragma once
template<class Iterator, class Ref, class Ptr>
class Reverse_Iterator
{
public:
typedef Reverse_Iterator<Iterator, Ref, Ptr> Self;
Reverse_Iterator(Iterator it)
:_cur(it)
{}
Ref operator*() // 为了对称需要返回前一个的位置
{
Iterator tmp = _cur;
--tmp;
return *tmp;
}
Self& operator++()
{
--_cur;
return *this;
}
Self operator++(int)
{
Iterator tmp(*this);;
--_cur;
return tmp;
}
Self& operator--()
{
++_cur;
return *this;
}
Self operator--(int)
{
Iterator tmp(*this);;
++_cur;
return tmp;
}
bool operator!=(const Self& s)
{
return _cur != s._cur;
}
private:
Iterator _cur;
};
反向迭代器的优势就在于,当我们写完了之后不仅仅是list这个容器可以使用,而且其余所有需要反向迭代器的容器都可以使用例如vector等,这样就可以提供了很多的便捷。