反向迭代器的概念非常的简单,就是和正向迭代器相反,它是倒过来遍历数据的。
它的底层是用正向迭代器进行适配的:
template <class Iterator>
class RverseIterator
{
typedef RverseIterator<iterator> Sef;
public:
RverseIterator(Iterator it)
:_it(it);
{
}
Self& operator ++()
{
--_it;
return *this;
}
Self& operator --()
{
++_it;
return *this;
}
bool operator !=(const Self& it) const
{
return _it != it;
}
private:
Iterator _it;
};
到这里代码实现问题不大,但是我们运算符重载*时发现和库中的大有区别:
这是什么原因呢?
因为库中的rbegin和rend不是我们想象的那种实现的:(以下是我们认为的)
所以真正的代码实现是这样的:
但是我们不知道迭代器中存储值的类型,我们依旧可以复用实现好的迭代器的模板参数:
以下是反向迭代器的完整代码:
#pragma once
template <class Iterator, class Ref, class Ptr>
class RverseIterator
{
typedef RverseIterator<Iterator, Ref, Ptr> Sef;
public:
RverseIterator(Iterator it)
:_it(it)
{
}
Ptr operator ->() //箭头就是返回数据的地址
{
return &(*_it);
}
Ref operator* ()
{
Iterator tmp = _it;
return *(--tmp);
}
Sef& operator ++()
{
--_it;
return *this;
}
Sef& operator --()
{
++_it;
return *this;
}
bool operator !=(const Sef& s) const
{
return _it != s._it;
}
private:
Iterator _it;
};
接下来我们可以将反向迭代器复用到我们之前实现的list里面去:
template<class T>
class list
{
typedef Listnode<T> Node;
public:
typedef _list_iterator<T,T&,T*> iterator;
typedef _list_iterator<T,const T&,const T*> const_iterator;
typedef RverseIterator<iterator, T&, T*> reverse_iterator;
typedef RverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end()const
{
return const_iterator(_head);
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend()const
{
return const_reverse_iterator(begin());
}
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
}
由此可以得出这样的结论:
反向迭代器是用正向迭代器适配出来的,我们只要写出了反向迭代器就可以复用到任何容器中,如list、vector。反向迭代器的学习了解就行,我们学习它的原因就是了解c++大佬们在设计反向迭代器的时候用到的设计理念。说白了反向迭代器是更深层次的封装。
到这里我对反向迭代器的理解就这么多了,如果讲述的不对的地方,希望大佬们指正出来!!