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

相关推荐
oier_Asad.Chen16 小时前
【OI学习笔记】Floyed-Warshall算法解决传递闭包问题
c++·笔记·学习·算法·图论·最短路·传递闭包
zmzb010316 小时前
C++课后习题训练记录Day179
开发语言·c++
hansang_IR17 小时前
【题解】[COCI 2024/2025 #2] 流明 / Blistavost
c++·算法·动态规划·dp
不正经学生17 小时前
C语言指针进阶:const 和野指针——给指针加锁,向野指针宣战
c语言·开发语言·c++·算法·c#
程序喵大人17 小时前
【C++进阶】STL算法与函数对象 - 01 让算法去处理一段迭代器范围
开发语言·c++·算法·函数对象
Keven_1117 小时前
算法札记:二叉树前序、中序、后序遍历及对应序列重要性质
数据结构·算法·深度优先
如此这般英俊17 小时前
手搓Claude Code-第十章 system_prompt
数据结构·人工智能·python·语言模型·自然语言处理·prompt
旖旎夜光18 小时前
LeetCode 738:单调递增的数字(贪心算法) —— 题解
数据结构·c++·算法·leetcode·贪心算法
旖旎夜光18 小时前
LeetCode 1262:可被三整除的最大和 (贪心算法)—— 题解
数据结构·c++·算法·leetcode·贪心算法
蒸蒸yyyyzwd19 小时前
cpp 选手转 ai infra 后端秋招学习笔记 day1
c++·transformer