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是一样的,这里就不进行写了

相关推荐
刘马想放假4 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠1 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
卷无止境1 天前
C++ 的Eigen 库全解析
c++
卷无止境1 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴1 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18003 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴3 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨4 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
Darling噜啦啦8 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4568 天前
C++进阶(1)——前景提要
c++