1.反向迭代器实现思路

一.反向迭代器大致实现

cpp 复制代码
#pragma once

template<class Iterator>
struct ReverseIterator
{
    ReverseIterator(Iterator it)
        :_it(it)
    {}
    
    Iterator _it;
};

二.重载一系列操作符

cpp 复制代码
#pragma once

template<class Iterator,class Ref,class Ptr>
struct ReverseIterator
{
    typedef ReverseIterator<Iterator,Ref,Ptr> Self;
    
    ReverseIterator(Iterator it)
        :_it(it)
    {}

    Ref operator*()
    {
        return *_it;
    }
    Ptr operator->()
    {
        return &(*_it);
    }
    Self& operator++()
    {
        --_it;
        return *this;
    }
    Self& operator--()
    {
        ++_it;
        return *this;
    }
    bool operator!=(const Self& it)
    {
        return _it != it._it;
    }
    bool operator==(const Self& it)
    {
        return _it == it._it;
    }

    Iterator _it;
};

三.构造一个list的反向迭代器

然后就能实现我们的rbegin()和rend()了

1.rbegin()的实现

cpp 复制代码
reverse_iterator rbegin()
        {
            return reverse_iterator(--end());
        }

2.rend()的实现

cpp 复制代码
        reverse_iterator rend()
        {
            return reverse_iterator(end());
        }

3.测试

cpp 复制代码
void test_list7()
    {
        ltw::List<int> lt;
        lt.push_back(1);
        lt.push_back(2);
        lt.push_back(3);
        lt.push_back(4);

        ltw::List<int>::reverse_iterator rit = lt.rbegin();
        while (rit != lt.rend())
        {
            cout << *rit << " ";
            ++rit;
        }
        cout << endl;
    }

上面这个是库里面的实现(但是,我们发现这不就错了吗)

这里纯粹是为了对称,所以这样实现

四.和库里面实现的一样

cpp 复制代码
#pragma once

template<class Iterator,class Ref,class Ptr>
struct ReverseIterator
{
    typedef ReverseIterator<Iterator,Ref,Ptr> Self;
    
    ReverseIterator(Iterator it)
        :_it(it)
    {}

    Ref operator*()
    {
        Iterator tmp = _it;
        return *(--tmp);
    }
    Ptr operator->()
    {
        return &(operator*());
    }
    Self& operator++()
    {
        --_it;
        return *this;
    }
    Self& operator--()
    {
        ++_it;
        return *this;
    }
    bool operator!=(const Self& it)
    {
        return _it != it._it;
    }
    bool operator==(const Self& it)
    {
        return _it == it._it;
    }

    Iterator _it;
};

这样,我们的list里面也要进行修改

cpp 复制代码
reverse_iterator rbegin()
        {
            return reverse_iterator(end());
        }

        reverse_iterator rend()
        {
            return reverse_iterator(begin());
        }

const版本是一样的

cpp 复制代码
const_reverse_iterator rbegin() const
        {
            return const_reverse_iterator(end());
        }

        const_reverse_iterator rend() const
        {
            return const_reverse_iterator(begin());
        }

vector也是和list是一样的,这里就不进行写了

相关推荐
智者知已应修善业25 分钟前
【51单片机只有一个8*8点阵数据如何滚动起来一片595+一组IO+花样】2022-1-15
c++·经验分享·笔记·单片机·蓝桥杯·硬件架构
水饺编程34 分钟前
第1章,[Win32 章节]:Windows 简史
c语言·c++·visual studio
List<String> error_P2 小时前
freertos数据结构--链表
数据结构·链表
无名猿2 小时前
手写一个线程池:任务队列、工作线程与停止顺序的三个设计点
c++·性能优化·并发编程·现代c++
longlongzihan3 小时前
LeetCode 128. 最长连续序列 —— 从排序到哈希集合
数据结构·c++·算法·leetcode·排序算法·哈希表
多弗朗皮卡丘3 小时前
C++多继承
开发语言·c++·多继承
mmmmath_33 小时前
二叉树の一些知识
数据结构·算法
程序员清风3 小时前
数据类型转换与日期时间处理
数据结构·pandas
SWAGGY..3 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
(Charon)3 小时前
【C++面试】堆内存与栈内存:string、vector和对象到底存在哪里
开发语言·c++·面试