反向迭代器
代码语言:javascript复制我们在实现正向迭代器的时候,它的 是下一个元素,--为上一个元素。对于反向迭代器它就是相反的, 为上一个元素,--为下一个元素 反向迭代器是复用了正向迭代器
iterator
cpptemplate <class Iterator,class Ref,class Ptr>
class __reverse_iterator
{
Iterator _it;
typedef __reverse_iterator<Iterator, Ref, Ptr> Self;
public:
__reverse_iterator(Iterator it)
:_it(it){}
Self& operator ()
{
--_it;
return *this;
}
Self& operator (int)
{
Iterator temp(_it);
--_it;
return Slef(temp);
}
Self& operator--()
{
_it;
return *this;
}
Self& operator--(int)
{
Iterator temp(_it);
_it;
return Slef(temp);
}
Ref operator*()
{
Iterator temp(_it);
return *(--temp);
}
Ptr operator->()
{
//return &(*_it);不能这样写,因为我们要访问当前节点的前一个数据
return &(operator*());
}
bool operator==(const Self& it)
{
return _it == it._it;
}
bool operator!=(const Self& it)
{
return _it != it._it;
}
};
list反向迭代器的使用
代码语言:javascript复制cpp typedef __reverse_iterator<iterator, T&, T*> reserve_iterator;
typedef __reverse_iterator<const_iterator, const T&, const T*> const_reserve_iterator;
reserve_iterator rbegin()
{
return reserve_iterator(end());
}
reserve_iterator rend()
{
return reserve_iterator(begin());
}
const_reserve_iterator rbegin()const
{
return reserve_iterator(end());
}
const_reserve_iterator rend()const
{
return reserve_iterator(begin());
}
反向迭代器的头为为正向迭代器的尾,正向迭代器的尾为反向迭代器的头,所以我们设计反向迭代器的时候在访问里面数据的时候,需要访问当前节点的后一个节点的值。 因为反向迭代器的头为尾,里面不是有效数据,这样设置的目的是为了和正向迭代器保持对称。
vector的反向迭代器
代码语言:javascript复制cpp typedef __reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef __reverse_iterator<iterator, const T&, const T*> const_reverse_iterator;
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
const_reverse_iterator rbegin()const
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rend()const
{
return reverse_iterator(begin());
}