目录

如果有小伙伴还未学习普通迭代器,请参考这篇文章中的普通迭代器实现。
【STL】list用法&试做_底层实现_花果山~~程序猿的博客-CSDN博客
参考list源码,这里直接说结果,发现源码通过借用普通迭代器来构造反向迭代器。
- namespace my_list
- {
- template <class T>
- struct list_node
- {
- list_node(const T& data = T())
- : _data(data)
- , _next(nullptr)
- , _prv(nullptr)
- {}
-
- T _data;
- list_node* _next;
- list_node* _prv;
- };
-
- template <class T, class Ref, class Ptr>
- struct list_iterator
- {
- typedef list_node
Node; - typedef list_iterator< T, Ref, Ptr> iterator;
-
- Node* _node;
-
- list_iterator(Node* node)
- : _node(node)
- {}
-
- bool operator!= (const iterator& it)
- {
- return _node != it._node;
- }
-
- bool operator==(const iterator& it)
- {
- return _node == it._node;
- }
-
- iterator& operator++()
- {
- _node = _node->_next;
- return *this;
- }
-
- iterator& operator--()
- {
- _node = _node->_prv;
- return *this;
- }
-
- iterator operator++(int)
- {
- iterator tmp(*this);
- _node = _node->_next;
- return *tmp;
- }
-
- Ptr operator*()
- {
- return _node->_data;
-
- }
- Ref operator->()
- {
- return &(operator*());
- }
- };
-
- template <class Iterator, class Ref, class Ptr>
- struct _reverse_iterator
- {
- typedef _reverse_iterator
reverse_iterator; -
- Iterator _cur;
-
- _reverse_iterator(const Iterator& cur)
- : _cur(cur)
- {}
-
- reverse_iterator& operator++()
- {
- --_cur;
- return *this;
- }
-
- reverse_iterator operator++(int)
- {
- reverse_iterator temp(*this);
- --_cur;
- return temp;
- }
-
- reverse_iterator& operator--()
- {
- ++_cur;
- return _cur;
- }
-
- reverse_iterator operator--(int)
- {
- reverse_iterator temp(*this);
- ++_cur;
- return temp;
- }
-
- // !=
- bool operator!=(const reverse_iterator& end)
- {
- return _cur != end._cur;
- }
-
- bool operator==(const reverse_iterator& end)
- {
- return _cur == end._cur;
- }
-
- // *
- Ptr operator*()
- {
- auto tmp = _cur;
- --tmp;
- return *tmp;
- }
-
- // ->
- Ref operator->()
- {
- return &(operator*());
- }
- };
-
- template <class T>
- class list
- {
- typedef list_node
Node; - public:
- typedef list_iterator
iterator; - typedef list_iterator
const T*, const T&> const_iterator; -
- typedef _reverse_iterator
reverse_iterator; - typedef _reverse_iterator
const T*, const T&> const_reverse_iterator; -
- reverse_iterator rbegin()
- {
- return reverse_iterator(end());
- }
-
- const_reverse_iterator rbegin() const
- {
- return const_reverse_iterator(end());
- }
-
- reverse_iterator rend()
- {
- return reverse_iterator(begin());
- }
-
- const_reverse_iterator rend() const
- {
- return const_reverse_iterator(begin());
- }
-
-
- iterator begin()
- {
- return iterator(_head->_next);
- }
-
- iterator end()
- {
- return iterator(_head);
- }
-
- const_iterator begin() const
- {
- return const_iterator(_head->_next);
- }
-
- const_iterator end() const
- {
- return const_iterator(_head);
- }
- ..... //list其他成员函数这里就不再赘述了
设计思路比较简单,本质上是复用普通迭代器的函数,其他重载函数思想跟普通函数差不多。
但这里也有一个比较艺术性的设计:

那这里我们来讨论一下,这个反向迭代器是否能给vector使用?? 答案是肯定的
看图:
结论:反向迭代器:迭代器的适配器。
那是不是所有的容器都合适呢?
不一定,因为容器的普通迭代器最起码要支持++,--接口(比如:foward_list就不支持--,所以其没有反向迭代器)
这里补充一些关于[STL]文档的使用,从迭代器功能角度分为三类:
1. forward_iterator (单向迭代器) 支持——> ++ 比如: foward_list等等
2. bidirectional_iterator(双向迭代器) ——> ++ -- 比如: list等
3. radom_access_iterator (随机迭起器) ——> ++ -- + - 比如:vector, deque等, 第三中迭代器继承1,2种
那意义又是什么??
意义:就是提示在使用迭代器时,接口会提示你合适的的迭代器类型。

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。