对于带有迭代器的容器,有正向迭代器,也有反向迭代器,而正向迭代器和反向迭代器比较相似,所以我们可以写一个反向迭代器的模板,给编译器,从传不同的容器的正向迭代器,实例化出对应的反向迭代器,也就是对正向迭代器进行封装,实现反向迭代器,
比如:
template<class Iterator,class Ref,class Ptr> struct ReverseIterator { typedef ReverseIterator<Iterator, Ref, Ptr> Self; Iterator _it; ReverseIterator(Iterator it) :_it(it) { } Ref operator*() { Iterator tmp = _it; return *(--tmp);//返回当前节点的上一个节点的值 } Ptr operator->() { return &(operator*()); } Self& operator++() { --_it; return *this; } Self& operator--() { ++_it; return *this; } bool operator!=(const Self& s) { return _it != s._it; } };
//反向迭代器 typedef ReverseIterator<iterator, T&, T*> reverse_iterator; typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator; reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); }
这是以list为例,实现的反向迭代器;
rbegin在end处,也就是哨兵位的地方,rend在begin处,这样写是为了和正向迭代器对称;
Ref operator*() { Iterator tmp = _it; return *(--tmp);//返回当前节点的上一个节点的值 }
当我i们返回节点时,先 -- 解引用,这样得到的是前一个节点的值,这样就可以解决哨兵位没有有效值的问题了;这个过程是对正向迭代器进行封装实现反向迭代器!