当前位置:   article > 正文

模拟实现list和vector反向迭代器_vector反向遍历

vector反向遍历

学习这部分知识,需要你了解vector和list的正向迭代器知识以及容器适配器知识,可以阅读我写的另外三篇vectorlist容器适配器 知识的博客!其中list知识内容尤其重要且难度要求很高!

反向迭代器,顾名思义是与正向迭代器相对,作用是反向遍历容器数据!

目录

一、反向迭代器

1.1 反向迭代器相关函数

1.1.1 rbegin() 

 1.1.2 rend() 

1.2反向迭代器反向遍历vector和list

1.2.1 反向遍历vector

1.2.2 反向遍历list

 二、模拟实现vector反向迭代器

2.1 vector正向迭代器

2.2 vector反向迭代器

2.3 模拟测试遍历vector

2.3.1 const反向迭代器效果

2.3.2  反向迭代器遍历

三、模拟实现list反向迭代器

3.1 list 正向迭代器

3.2 模拟实现list反向迭代器

3.3 测试反向迭代器遍历 

3.3.1 const迭代器效果展示

3.3.2 反向迭代器遍历list

 四、模拟实现vector完整版

五、模拟实现list完整版


一、反向迭代器

1.1 反向迭代器相关函数

C++11中加了独立的返回const迭代器的函数,但这篇博客只模拟实现list的const函数重载来返回const迭代器! 具体这些函数请查看cplusplus.com - The C++ Resources Network

1.1.1 rbegin() 

返回值:返回指向容器中最后一个元素(即其反向开头)的反向迭代器!

const修饰的函数返回值:返回const反向迭代器,其指向成员不能被修改!

 1.1.2 rend() 

返回值:返回一个反向迭代器,该迭代器指向容器中第一个元素之前的理论元素

const修饰的函数返回值:返回const反向迭代器,其指向成员不能被修改!

1.2反向迭代器反向遍历vector和list

1.2.1 反向遍历vector

1.2.2 反向遍历list


 二、模拟实现vector反向迭代器

2.1 vector正向迭代器

  1. namespace wyz//与标准库vector区别,自己定义一个命名空间,在里面写!
  2. {
  3. template<class T>
  4. class vector
  5. {
  6. public:
  7. //...
  8. //迭代器
  9. typedef T* iterator;
  10. typedef const T* const_iterator;
  11. iterator begin()
  12. {
  13. return _start;
  14. }
  15. iterator end()
  16. {
  17. return _finish;
  18. }
  19. const_iterator cbegin()const
  20. {
  21. return _start;
  22. }
  23. const_iterator cend()const
  24. {
  25. return _finish;
  26. }
  27. private:
  28. iterator _start;
  29. iterator _finish;
  30. iterator _end_of_storage;
  31. };

2.2 vector反向迭代器

反向迭代器是反向遍历容器数据,它也要满足++、--、*、==、!=的功能,只不过它的++是从后往前,--是从前往后。我们很容易可以想到,反向迭代器和正向的功能差不多相同,只不过在++,--的效果相反!vector正向迭代器底层是指针,它的算法迎合基本的逻辑,++向后,--向前!我们无法直接实现让变量++指针减小,--指针增加!所以我们要用到容器适配器,底层我们可以用正向迭代器!反向的效果只要让正向反着来!--让正向++,++让正向--!这样一来我们的遍历就可以实现!也就是说,我们要将反向迭代器封装成类

下面我们直接上代码:

  1. template<class iterator, class T>
  2. struct vector_reverse_iterator
  3. {
  4. typedef vector_reverse_iterator<iterator, T> Self;
  5. public:
  6. //拷贝构造
  7. vector_reverse_iterator(iterator s)
  8. {
  9. _it = _it;
  10. }
  11. Self& operator++()
  12. {
  13. --_it;
  14. return *this;
  15. }
  16. Self& operator--()
  17. {
  18. ++_it;
  19. return *this;
  20. }
  21. T operator*()
  22. {
  23. iterator tmp = _it;
  24. return *(--tmp);//注意这个返回!
  25. }
  26. bool operator!=(Self s)
  27. {
  28. return _it != s._it;
  29. }
  30. bool operator==(Self s)
  31. {
  32. return _it == s._it;
  33. }
  34. private:
  35. iterator _it;
  36. };

 在来看看vector中的反向迭代器的申明与相关函数:

  1. typedef T* iterator;
  2. typedef const T* const_iterator;
  3. typedef vector_reverse_iterator<iterator,T> reverse_iterator;
  4. typedef vector_reverse_iterator<const_iterator,const T> const_reverse_iterator;
  5. //正向迭代器
  6. iterator begin()
  7. {
  8. return _start;
  9. }
  10. iterator end()
  11. {
  12. return _finish;
  13. }
  14. const_iterator cbegin()const
  15. {
  16. return _start;
  17. }
  18. const_iterator cend()const
  19. {
  20. return _finish;
  21. }
  22. //反向迭代器传参,这里为了与正向对称,直接传_finish和_start
  23. reverse_iterator rbegin()
  24. {
  25. return reverse_iterator(_finish);
  26. }
  27. reverse_iterator rend()
  28. {
  29. return reverse_iterator(_start);
  30. }
  31. //const反向迭代器,不能修改迭代器指向数据!
  32. const_reverse_iterator crbegin()const
  33. {
  34. return const_reverse_iterator(_finish);
  35. }
  36. const_reverse_iterator crend()const
  37. {
  38. return const_reverse_iterator(_start);
  39. }

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