当前位置:   article > 正文

【C++初阶】十二、STL---反向迭代器的实现_c++ rbegin

c++ rbegin

目录

一、反向迭代器

二、反向迭代器的实现


一、反向迭代器

        之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器

        反向迭代器也是适配器(配接器)的一种,反向迭代器的实现是对正向迭代器的封装,即实现的反向迭代器能支持多种容器,给出该容器的正向迭代器就能支持反向迭代器

        比如 vector 需要反向迭代器,那就把 vector 的正向迭代器传给 反向迭代器,它就可以通过正向迭代器转换出 vector 的反向迭代器。

        也就是说,实现的反向迭代器并包装的这个类,不是针对某个容器而是针对所有容器的,任何一个容器只要你实现了正向迭代器,就可以通过其适配出反向迭代器

要注意反向迭代器的错位访问

对于 list 而言,正向迭代器的 begin 和 end 位置如下

        begin 位于头结点的下一个节点,end 则位于尾结点的下一个节点,即头节点,正向迭代器 ++ 操作,迭代器是往后走的

反向迭代器 rbegin 和 rend 位置如下

        反向迭代器 rbegin() 位于正向迭代器 end() 的位置, 反向迭代器 rend() 位于正向迭代器 begin() 的位置,反向迭代器 ++操作迭代器是往前走的

vector 反向迭代器也是如此

对于 list 来说,反向迭代器解引用取数据,取的是头节点上一个节点位置的数据,vector 也是如此

二、反向迭代器的实现

Iterator.h

  1. #pragma once
  2. template<class Iterator, class Ref, class Ptr>
  3. class ReverseIterator
  4. {
  5. typedef ReverseIterator<Iterator, Ref, Ptr> Self;
  6. public:
  7. ReverseIterator(Iterator it)
  8. :_it(it)
  9. {}
  10. Ref operator*()
  11. {
  12. Iterator tmp = _it;
  13. return *(--tmp); //取的是上一个的数据
  14. }
  15. Ptr operator->()
  16. {
  17. return &(operator*());//取的是上一个的数据的地址
  18. }
  19. Self& operator++()
  20. {
  21. --_it;
  22. return *this;
  23. }
  24. Self& operator--()
  25. {
  26. ++_it;
  27. return *this;
  28. }
  29. bool operator!=(const Self& s)
  30. {
  31. return _it != s._it;
  32. }
  33. private:
  34. Iterator _it;
  35. };

下面套到 list 里面进行测试

  1. //反向迭代器
  2. typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
  3. typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

在 list 里面添加反向迭代器代码

  1. reverse_iterator rbegin()
  2. {
  3. return reverse_iterator(end());
  4. }
  5. reverse_iterator rend()
  6. {
  7. return reverse_iterator(begin());
  8. }

测试代码

  1. void Test_ReverseIterator()
  2. {
  3. fy::list<int> lt;
  4. lt.push_back(1);
  5. lt.push_back(2);
  6. lt.push_back(3);
  7. lt.push_back(4);
  8. lt.push_back(5);
  9. lt.push_back(6);
  10. fy::list<int>::iterator it = lt.begin();
  11. while (it != lt.end())
  12. {
  13. cout << *it << " ";
  14. ++it;
  15. }
  16. cout << endl;
  17. fy::list<int>::reverse_iterator rit = lt.rbegin();
  18. while (rit != lt.rend())
  19. {
  20. cout << *rit << " ";
  21. ++rit;
  22. }
  23. cout << endl;
  24. }

 运行结果

list 的反向迭代器就完成了,下面测试 vector 的反向迭代器

把 Iterotor.h 拷贝一份到 vector 里面

  1. //反向迭代器
  2. typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
  3. typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;

在 vector 里面添加反向迭代器代码

  1. reverse_iterator rbegin()
  2. {
  3. return reverse_iterator(end());
  4. }
  5. reverse_iterator rend()
  6. {
  7. return reverse_iterator(begin());
  8. }

测试代码

  1. void Test_ReverseIterator()
  2. {
  3. fy::vector<int> v;
  4. v.push_back(1);
  5. v.push_back(2);
  6. v.push_back(3);
  7. v.push_back(4);
  8. v.push_back(5);
  9. v.push_back(6);
  10. fy::vector<int>::iterator it = v.begin();
  11. while (it != v.end())
  12. {
  13. cout << *it << " ";
  14. ++it;
  15. }
  16. cout << endl;
  17. //反向迭代器
  18. fy::vector<int>::reverse_iterator rit = v.rbegin();
  19. while (rit != v.rend())
  20. {
  21. cout << *rit << " ";
  22. ++rit;
  23. }
  24. cout << endl;
  25. }

运行结果

----------------我是分割线---------------

文章到这里就结束了,下一篇即将更新

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/390806
推荐阅读
相关标签
  

闽ICP备14008679号