• C++(反向迭代器)


    前言:

    上一章我们介绍了适配器,也提了一下迭代器适配器,今天我们就从反向迭代器把迭代器适配器给解释一下。

    既然 都叫迭代器容器了 就说名只要接口合适他可以封装实现各种容器需求包括vector list 。


    目录

    1.反向迭代器设计

    1.1反向迭代器思想 

    1.2多参数模板

    2.vecor反向迭代器

    3.list反向迭代器



    1.反向迭代器设计

     反向迭代器 reverse_iterator 可以用来反向遍历容器,在某些场景下很实用

    1.1反向迭代器思想 

    因为数组比较简单,我们就从数组引出反向的思想。 

     

    注:库中的反向迭代器在设计时,为了最求极致的对称,rbegin() 指向最后一个有效元素的下一个位置,rend() 指向第一个有效元素(位置是与正向迭代器相反的)

     通过图示知道,反向迭代器的++就是正向迭代器的--。反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。

    1.2多参数模板

    在模拟实现list迭代器时候,我们在const对象对普通对象代码的复用的 过程中,引入了多参数模板,不同参数实现不同功能,反向迭代器的实现同样适用。有两点需要注意:

    • 重载operator*()返回的是目标对象的引用,又因为库里追求极致对称,所以我们应该先执行--操作后返回对象的引用。
    • 具体返回的对象是否需要const修饰,取决于我们使用的模板参数。

     

    1. #pragma once
    2. namespace cmx
    3. {
    4. template <class iterator, class Ref, class Ptr>
    5. struct Reverselterator
    6. {
    7. typedef Reverselterator self;
    8. iterator _it;
    9. Reverselterator(iterator it)
    10. :_it(it)
    11. {}
    12. Ref operator *()
    13. {
    14. iterator tmp = _it;
    15. return *(--tmp);
    16. }
    17. Ptr operator ->()
    18. {
    19. return &(operator*());
    20. }
    21. self& operator++()
    22. {
    23. -- _it;
    24. return *this;
    25. }
    26. self& operator--()
    27. {
    28. ++ _it;
    29. return *this;
    30. }
    31. bool operator !=(const self& s) const
    32. {
    33. return _it != s._it;
    34. }
    35. };
    36. }

    完成头文件的编写之后,我们就可以把他运用于所有可以用迭代器访问的容器 比如 vector list,只需要修改模版参数中正向迭代器的代码就可以适配出属于自己的反向迭代器。

    2.vecor反向迭代器

     只需要引用 反向迭代器的头文件 ReverseIterator.h 就可以使用,具体代码如下:

    1. #include
    2. #include"ReverseIterator.h"
    3. namespace cmx
    4. {
    5. template<class T>
    6. class vector
    7. {
    8. public:
    9. typedef T* iterator;
    10. typedef const T* const_iterator;
    11. typedef Reverselterator reverse_iterator;
    12. typedef Reverselteratorconst T&, const T*> const_reverse_iterator;
    13. reverse_iterator rebegin()
    14. {
    15. //this调用的end()函数
    16. return reverse_iterator(end());
    17. }
    18. reverse_iterator rend()
    19. {
    20. return reverse_iterator(begin());
    21. }

    3.list反向迭代器

     代码如下:

    1. template<class T>
    2. class list
    3. {
    4. typedef list_node Node;
    5. public:
    6. typedef __list_iterator iterator;
    7. typedef __list_iteratorconst T&, const T*> const_iterator;
    8. typedef Reverselterator reverse_iterator;
    9. typedef Reverselteratorconst T&, const T*> const_reverse_iterator;

  • 相关阅读:
    【多线程】创建线程池有几种方式
    PDF水印怎么加?分享三个添加水印小妙招
    Redis 源码简洁剖析 16 - 客户端
    DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》课程讲解之项目信息文档管理与配置管理
    阿里面试,HashMap与Redis哈希结构扩容的区别
    【AI作画】使用stable-diffusion-webui搭建AI作画平台
    Redis代替session 实现登录流程
    ssm基于Java web 的人人影视网站管理系统毕业设计源码290915
    FUNCTION 表示 getter setter
    【Linux】进程数据结构
  • 原文地址:https://blog.csdn.net/weixin_45476980/article/details/133622633