• iterator的用法 | reverse_iterator的封装实现


    进阶C++__STL__容器list使用方法【简单易懂】https://blog.csdn.net/qq_61386381/article/details/125922910

    进阶C++__STL__容器vector使用方法【简单易懂】_https://blog.csdn.net/qq_61386381/article/details/125869840

    对 map 和 set 来说,它们的 erase 函数返回的 void,而在进行 erase 之后,当前迭代器会失效,无法再用于获取下一个迭代器。因此需要 erase 之前就获取指向下一个元素的迭代器

    1. tmpIt = it;
    2. ++it;
    3. c.erase(tmpIt);

    利用后缀++操作符的特性(先创建副本,然后再递增迭代器,然后返回副本)上面的三行代码可以简化为一行:

    c.erase(it++);

    list 正向遍历删除元素示例(vector 用法相同):

    1.     list<int>::iterator it;
    2.     for (it = l.begin(); it != l.end();)
    3.     {
    4.         if (0 == (*it) % 2) {
    5.             it = l.erase(it);
    6.         }
    7.         else {
    8.             ++it;
    9.         }
    10.     }

    map 正向遍历删除元素示例(set 用法相同):
     

    1.   map<int, int>::iterator mit;
    2.     for (mit = m.begin(); mit != m.end();)
    3.     {
    4.         if (0 == mit->first % 2) {
    5.             m.erase(mit++);
    6.         }
    7.         else {
    8.             ++mit;
    9.         }
    10.     }

    reverse_iterator的封装实现

    反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。

    值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:

    • 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 -- 操作,意味着反向迭代器在反向遍历容器;
    • 当反向迭代器执行 -- 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。


    另外,实现反向迭代器的模板类定义在 头文件,并位于 std 命名空间中。 

    函数接口 

    1. // 将以下代码适配到vector和list中做反向迭代器,理解反向迭代器的原理
    2. namespace bit
    3. {
    4. // 适配器 -- 复用
    5. template<class Iterator, class Ref, class Ptr>
    6. struct Reverse_iterator
    7. {
    8. Iterator _it;
    9. typedef Reverse_iterator Self;
    10. Reverse_iterator(Iterator it)
    11. :_it(it)
    12. {}
    13. Ref operator*()
    14. {
    15. Iterator tmp = _it;
    16. return *(--tmp);
    17. }
    18. Ptr operator->()
    19. {
    20. return &(operator*());
    21. }
    22. Self& operator++()
    23. {
    24. --_it;
    25. return *this;
    26. }
    27. Self& operator--()
    28. {
    29. ++_it;
    30. return *this;
    31. }
    32. bool operator!=(const Self& s)
    33. {
    34. return _it != s._it;
    35. }
    36. };
    37. }

    函数实现

    1. namespace bit
    2. {
    3. template<class T>
    4. class vector
    5. {
    6. public:
    7. typedef T* iterator;
    8. typedef const T* const_iterator;
    9. // 反向迭代器适配支持
    10. typedef Reverse_iterator reverse_iterator;
    11. typedef Reverse_iteratorconst T&, const T*> const_reverse_iterator;
    12. const_reverse_iterator rbegin() const
    13. {
    14. // list_node*
    15. return const_reverse_iterator(end());
    16. }
    17. const_reverse_iterator rend() const
    18. {
    19. return const_reverse_iterator(begin());
    20. }
    21. reverse_iterator rbegin()
    22. {
    23. return reverse_iterator(end());
    24. }
    25. reverse_iterator rend()
    26. {
    27. return reverse_iterator(begin());
    28. }
    29. iterator begin()
    30. {
    31. return _start;
    32. }
    33. iterator end()
    34. {
    35. return _finish;
    36. }
    37. const_iterator begin() const
    38. {
    39. return _start;
    40. }
    41. const_iterator end() const
    42. {
    43. return _finish;
    44. }
    45. // ...
    46. }
    47. namesapce std
    48. {
    49. template<class T>
    50. class list
    51. {
    52. typedef list_node Node;
    53. public:
    54. typedef __list_iterator iterator;
    55. typedef __list_iteratorconst T&, const T*> const_iterator;
    56. // 反向迭代器适配支持
    57. typedef Reverse_iterator reverse_iterator;
    58. typedef Reverse_iteratorconst T&, const T*> const_reverse_iterator;
    59. const_iterator begin() const
    60. {
    61. // list_node*
    62. return const_iterator(_head->_next);
    63. }
    64. const_iterator end() const
    65. {
    66. return const_iterator(_head);
    67. }
    68. iterator begin()
    69. {
    70. return iterator(_head->_next);
    71. //return _head->_next;
    72. }
    73. iterator end()
    74. {
    75. return iterator(_head);
    76. }
    77. const_reverse_iterator rbegin() const
    78. {
    79. // list_node*
    80. return const_reverse_iterator(end());
    81. }
    82. const_reverse_iterator rend() const
    83. {
    84. return const_reverse_iterator(begin());
    85. }
    86. reverse_iterator rbegin()
    87. {
    88. return reverse_iterator(end());
    89. }
    90. reverse_iterator rend()
    91. {
    92. return reverse_iterator(begin());
    93. }
    94. //...
    95. }
    96. }

  • 相关阅读:
    python爬虫练习,爬取iview,element组件库图标名称
    6年测试开发经验面试28K公司后,整理出这套高频面试题和答案
    python经典百题之字符串连接
    Liunx中系统安全及文件系统(极其粗糙版)
    Maven的详细介绍(maven的全据配置以及idea中maven的配置)
    String类常用方法
    Celery笔记二之celery项目建立、配置及加载方式介绍
    vivado 高级编程功能1
    【【萌新的FPGA学习之快速回顾 水 水 】】
    大语言模型底层架构丨带你认识Transformer
  • 原文地址:https://blog.csdn.net/qq_61386381/article/details/126432974