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

相关推荐
秋天的怀念_David8 分钟前
听故事学语言 · 数据结构篇 · 序章一 算法之问
数据结构·程序人生·算法
kiracrimson1 小时前
编码简述:内存里没有文字,只有一张对照表
开发语言·c++·二进制·计算机组成原理
-dzk-1 小时前
【链表】LC 25.K 个一组翻转链表
数据结构·链表
磊磊cpp1 小时前
CRC8 校验原理与实现详解(附可交互动画演示)
c++·交互
careathers1 小时前
【数据结构】基于比较的排序算法 - 插入排序
java·数据结构·排序算法
MicrosoftCloud1 小时前
数据结构 07(上)|查找:顺序、折半、分块,ASL 到底怎么
数据结构·查找·顺序查找·折半查找·分块查找·平均查找长度·asl
Mortalbreeze2 小时前
0 - 1 BFS 算法详解:从基本原理到经典题目建模
数据结构·c++·算法·图论·宽度优先
进化中的刀盾兽4 小时前
从零实现 C++ Json-Rpc(十):把消息交给真实连接——MuduoConnection 与 ConnectionFactory
c++·rpc
青瓦梦滋10 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http