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

相关推荐
wengqidaifeng28 分钟前
C++从菜鸟到强手:1.基础入门
开发语言·c++
handler018 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
不爱吃炸鸡柳9 小时前
数据结构精讲:树 → 二叉树 → 堆 从入门到实战
开发语言·数据结构
t***5449 小时前
如何在Dev-C++中使用Clang编译器
开发语言·c++
Qbw20049 小时前
【Linux】进程地址空间
linux·c++
Aurorar0rua10 小时前
CS50 x 2024 Notes C - 05
java·c语言·数据结构
NoSi EFUL10 小时前
redis存取list集合
windows·redis·list
6Hzlia10 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香11 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut11 小时前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划