• 【C++】反向迭代器精讲(以list为例)


    目录

    二,全部代码

    三,设计思路 

    1. 讨论

    2. 关于迭代器文档一个小细节 

    结语


    一,前言

    如果有小伙伴还未学习普通迭代器,请参考这篇文章中的普通迭代器实现。

    【STL】list用法&试做_底层实现_花果山~~程序猿的博客-CSDN博客

     参考list源码,这里直接说结果,发现源码通过借用普通迭代器来构造反向迭代器。

    二,全部代码

    1. namespace my_list
    2. {
    3. template <class T>
    4. struct list_node
    5. {
    6. list_node(const T& data = T())
    7. : _data(data)
    8. , _next(nullptr)
    9. , _prv(nullptr)
    10. {}
    11. T _data;
    12. list_node* _next;
    13. list_node* _prv;
    14. };
    15. template <class T, class Ref, class Ptr>
    16. struct list_iterator
    17. {
    18. typedef list_node Node;
    19. typedef list_iterator< T, Ref, Ptr> iterator;
    20. Node* _node;
    21. list_iterator(Node* node)
    22. : _node(node)
    23. {}
    24. bool operator!= (const iterator& it)
    25. {
    26. return _node != it._node;
    27. }
    28. bool operator==(const iterator& it)
    29. {
    30. return _node == it._node;
    31. }
    32. iterator& operator++()
    33. {
    34. _node = _node->_next;
    35. return *this;
    36. }
    37. iterator& operator--()
    38. {
    39. _node = _node->_prv;
    40. return *this;
    41. }
    42. iterator operator++(int)
    43. {
    44. iterator tmp(*this);
    45. _node = _node->_next;
    46. return *tmp;
    47. }
    48. Ptr operator*()
    49. {
    50. return _node->_data;
    51. }
    52. Ref operator->()
    53. {
    54. return &(operator*());
    55. }
    56. };
    57. template <class Iterator, class Ref, class Ptr>
    58. struct _reverse_iterator
    59. {
    60. typedef _reverse_iterator reverse_iterator;
    61. Iterator _cur;
    62. _reverse_iterator(const Iterator& cur)
    63. : _cur(cur)
    64. {}
    65. reverse_iterator& operator++()
    66. {
    67. --_cur;
    68. return *this;
    69. }
    70. reverse_iterator operator++(int)
    71. {
    72. reverse_iterator temp(*this);
    73. --_cur;
    74. return temp;
    75. }
    76. reverse_iterator& operator--()
    77. {
    78. ++_cur;
    79. return _cur;
    80. }
    81. reverse_iterator operator--(int)
    82. {
    83. reverse_iterator temp(*this);
    84. ++_cur;
    85. return temp;
    86. }
    87. // !=
    88. bool operator!=(const reverse_iterator& end)
    89. {
    90. return _cur != end._cur;
    91. }
    92. bool operator==(const reverse_iterator& end)
    93. {
    94. return _cur == end._cur;
    95. }
    96. // *
    97. Ptr operator*()
    98. {
    99. auto tmp = _cur;
    100. --tmp;
    101. return *tmp;
    102. }
    103. // ->
    104. Ref operator->()
    105. {
    106. return &(operator*());
    107. }
    108. };
    109. template <class T>
    110. class list
    111. {
    112. typedef list_node Node;
    113. public:
    114. typedef list_iterator iterator;
    115. typedef list_iteratorconst T*, const T&> const_iterator;
    116. typedef _reverse_iterator reverse_iterator;
    117. typedef _reverse_iteratorconst T*, const T&> const_reverse_iterator;
    118. reverse_iterator rbegin()
    119. {
    120. return reverse_iterator(end());
    121. }
    122. const_reverse_iterator rbegin() const
    123. {
    124. return const_reverse_iterator(end());
    125. }
    126. reverse_iterator rend()
    127. {
    128. return reverse_iterator(begin());
    129. }
    130. const_reverse_iterator rend() const
    131. {
    132. return const_reverse_iterator(begin());
    133. }
    134. iterator begin()
    135. {
    136. return iterator(_head->_next);
    137. }
    138. iterator end()
    139. {
    140. return iterator(_head);
    141. }
    142. const_iterator begin() const
    143. {
    144. return const_iterator(_head->_next);
    145. }
    146. const_iterator end() const
    147. {
    148. return const_iterator(_head);
    149. }
    150. ..... //list其他成员函数这里就不再赘述了

    三,设计思路 

    设计思路比较简单,本质上是复用普通迭代器的函数,其他重载函数思想跟普通函数差不多。

    但这里也有一个比较艺术性的设计:

    1. 讨论

    那这里我们来讨论一下,这个反向迭代器是否能给vector使用??  答案是肯定的

    看图:

    结论:反向迭代器:迭代器的适配器。

    2. 关于迭代器文档一个小细节 

    那是不是所有的容器都合适呢? 

    不一定,因为容器的普通迭代器最起码要支持++,--接口(比如:foward_list就不支持--,所以其没有反向迭代器)

    这里补充一些关于[STL]文档的使用,从迭代器功能角度分为三类:

    1. forward_iterator  (单向迭代器)      支持——>  ++                比如: foward_list等等

    2. bidirectional_iterator(双向迭代器)   ——>  ++  --            比如: list等

    3. radom_access_iterator  (随机迭起器) ——>  ++ --  + -   比如:vector, deque等, 第三中迭代器继承1,2种

    那意义又是什么??

    意义:就是提示在使用迭代器时,接口会提示你合适的的迭代器类型。

     

    结语

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

  • 相关阅读:
    TS的类型规则 类型排名
    提取PDF数据:Documents for PDF ( GcPdf )
    QT应用启动失败排查方法
    数仓总结题
    PHP 排序函数使用方法,按照字母排序等操作
    2022年全国最新消防设施操作员(中级消防设施操作员)真题题库及答案
    TensorFlow案例学习:图片风格迁移
    “综合”web项目编写------手把手0基础教学(一)
    Linux日志打包脚本
    2的幂次方(冬季每日一题 10)
  • 原文地址:https://blog.csdn.net/qq_72112924/article/details/132694812