在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载
反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意类型的双向迭代器都可以直接复用反向迭代器
本章将把两个迭代器的实现放在一起比对,更好的体会迭代器的封装
详解可以看list模拟实现那一章节,这里仅提供一份代码用于对照反向迭代器
- template<class T,class Ref,class Ptr>
- struct __list_iterator
- {
- typedef list_node
node; - typedef __list_iterator
self; - node* _pnode;
-
- __list_iterator(node* p)
- :_pnode(p)
- {}
-
- self& operator++()
- {
- _pnode = _pnode->_next;
- return *this;
- }
- self& operator--()
- {
- _pnode = _pnode->_prev;
- return *this;
- }
- self operator++(int)
- {
- self tmp(_pnode);
- _pnode = _pnode->_next;
- return tmp;
- }
- self operator--(int)
- {
- self tmp(_pnode);
- _pnode = _pnode->_prev;
- return tmp;
- }
- Ref operator*()
- {
- return _pnode->_data;
- }
- Ptr operator->()
- {
- return &(_pnode->_data);
- }
- bool operator!=(const self& p)
- {
- return _pnode != p._pnode;
- }
- bool operator==(const self& p)
- {
- return _pnode == p._pnode;
- }
- };
反向迭代器的实现是对正向迭代器的封装
- template<class Iterator,class Ref,class Ptr>
- struct ReserveIterator
- {
- typedef ReserveIterator self;//重命名方便使用
- Iterator _it;//成员变量
-
- ReserveIterator(Iterator it)
- :_it(it)
- {}
- }
在反向迭代器的概念中,反向迭代器++,就是正向迭代器--
- self& operator++()
- {
- _it--;
- return *this;
- }
- self& operator--()
- {
- _it++;
- return *this;
- }
- //前置++和--
- self operator++(int)
- {
- self tmp(*this);
- _it--;
- return tmp;
- }
- self operator--(int)
- {
- self tmp(*this);
- _it++;
- return tmp;
- }
- bool operator!=(const self& s)
- {
- return _it != s._it;
- }
- bool operator==(const self& s)
- {
- return _it == s._it;
- }
在实现operator*()之前,要先理解底层,在stl库内的实现,为了让begin()和rend(),所在的物理空间上对称,但在使用的角度上来看,并不对称,为了使其对称,且不影响使用,对*和->的实现作出了调整,解引用返回的是其前一个的位置
- Ref operator*()
- {
- Iterator tmp(_it);
- _it--;
- return *tmp;
- }
- Ptr operator->()
- {
- Iterator tmp(_it);
- _it--;
- return &(*_it);
- }
- typedef __list_iterator
iterator; - typedef __list_iterator
const T&, const T*> con_iterator; - typedef ReverseIterator
reverse_iterator; - typedef ReverseIterator
const T&,const T*> con_reverse_iterator; -
- iterator begin()
- {
- return iterator(_head->_next);
- }
- iterator end()
- {
- return iterator(_head);
- }
- con_iterator begin()const
- {
- return con_iterator(_head->_next);
- }
- con_iterator end()const
- {
- return con_iterator(_head);
- }
- reverse_iterator rbegin()
- {
- return reverse_iterator(end());
- }
- reverse_iterator rend()
- {
- return reverse_iterator(begin());
- }
本章整理了关于反向迭代器的相关内容,以及模拟实现