STL之list模拟实现(反向迭代器讲解以及迭代器失效)

这篇具有很好参考价值的文章主要介绍了STL之list模拟实现(反向迭代器讲解以及迭代器失效)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这次是关于list的模拟实现的代码,先看看下面的代码:

#pragma once
#include <iostream>
#include "reve_iterator.hpp"
using namespace std;
namespace cc
{
 //链表节点
 template<class T>
 struct ListNode
 {
    T _val;
    ListNode *_next;
    ListNode *_prev;
    ListNode(const T& x=T())
        : _val(x)
        , _next(nullptr)
        , _prev(nullptr)
    {}
 }; 
 //迭代器
 template<class T,class ref,class ptr>
 struct list_iterator
 {
    typedef ListNode<T> Node;
    typedef list_iterator<T,ref,ptr> iterator;
    list_iterator(Node *node)
        : _node(node)
    {}
    iterator& operator++()
    {
        _node=_node->_next;
        return *this;
    }
    iterator operator++(int)
    {
        iterator tem(_node);
        _node=_node->_next;
        return tem;
    }
    iterator& operator++()const
    {
        _node=_node->_next;
        return *this;
    }
    iterator operator++(int)const
    {
        iterator tem(_node);
        _node=_node->_next;
        return tem;
    }
    iterator& operator--()
    {
        _node=_node->_prev;
        return *this;
    }
    iterator operator--(int)
    {
        iterator tem(_node);
        _node=_node->_prev;
        return tem;
    }
    bool operator!=(const iterator& d)const
    {
        return _node!=d._node;
    }
    ref operator*()const
    {
        return _node->_val;
    }
    ptr operator->()const
    {
        return &(_node->_val);
    }
    Node *_node;
 };
 //链表
 template<class T>
 class List
 {
public:
    typedef ListNode<T> Node;
    typedef list_iterator<T,T&,T*> iterator;
    typedef list_iterator<T,const T&,const T*> const_iterator;
    typedef reve_iterator<iterator,T&,T*> riterator;
    typedef reve_iterator<iterator,const T&,const T*> const_riterator;
    void init()
    {
        _head->_next=_head;
        _head->_prev=_head;
    }
    List()
        : _head(new Node)
    {
        _head->_next=_head;
        _head->_prev=_head;
    }
    template<typename Iterator>
    List(Iterator begin,Iterator end)
        : _head(new Node)
    {
        init();
        while(begin!=end)
        {
            push_back(*begin);
            begin++;
        }
    }
    List(const List<T>& d)
        : _head(nullptr)
    {
        List<T> tem(d.begin(),d.end());
        swap(tem);
    }
    List<T>& operator=(List<T> d)
    {
        swap(d);
        return *this;
    }
    iterator begin()
    {
        return iterator(_head->_next);
    }
    iterator end()
    {
        return iterator(_head);
    }
    riterator rbegin()
    {
        return riterator(_head);
    }
    riterator rend()
    {
        return riterator(_head->_next);
    }
    const_iterator begin()const
    {
        return const_iterator(_head->_next);
    }
    const_iterator end()const
    {
        return const_iterator(_head);
    }
    void swap(List<T>& d)
    {
        std::swap(_head,d._head);
    }
    void push_back(const T& x=T())
    {
        Node *cur=new Node(x);
        Node *tail=_head->_prev;
        tail->_next=cur;
        cur->_prev=tail;
        cur->_next=_head;
        _head->_prev=cur;
    }
private:
    Node *_head;
 };
}

上面是list的代码,其底层是一个带头双向循环的链表,实现的方法就不说了,相信大家已经都会了,然后自己实心的list我没有写析构函数等,这个也很简单,循环利用成员函数中的删除函数就可以。

先来说说个人认为比较重要的东西:

首先是迭代器失效:list迭代器的失效与vector不同,list的迭代器在插入时不会有迭代器失效的现象,只有在删除的时候才有迭代器失效的现象,插入没有失效现象的原因,很简单,就不多说,而删除导致迭代器失效的原因是,在删除一个节点的时候,我们把这个节点所占的空间已经给释放了,所以此时指向这个节点的指针已经是野指针了,所以导致迭代器失效。

其次就是反向迭代器的实现了,我们先看看下面的反向迭代器的代码:

#pragma once
#include "list.hpp"
namespace cc
{
    template<class Iterator,class ref,class ptr>
    struct reve_iterator
    {
    public:
        typedef reve_iterator<Iterator,ref,ptr> riterator;
        reve_iterator(Iterator it)
            : It(it)
        {}
        bool operator!=(const riterator& d)const
        {
            return It!=d.It;
        }
        riterator& operator++()
        {
            It--;
            return *this; 
        }
        riterator operator++(int)
        {
            Iterator tem(It);
            It--;
            return riterator(tem);
        }
        riterator& operator++()const
        {
            It--;
            return *this; 
        }
        riterator operator++(int)const
        {
            Iterator tem(It);
            It--;
            return riterator(tem);
        }
        ref operator*()const
        {
            Iterator tem(It);
            return *(--tem);
        }
        ptr operator->()const
        {
            return &(*It);
        }
    private:
        Iterator It;
    };
}

以上就是反向迭代器实现的代码,在list中的迭代器,不像我们之前的迭代器是原生指针,list的迭代是我们的自己定义的类似于一个指针的类,个人理解其实就是指针,只不过这个指针被包装了,我们以前用的指针没有被包装而已。那就来说说实现方法吧。首先就是这个指针类的成员函数了,运算符的重载一定要有,具体的看上面代码。主要讲解的是,因为反向迭代器的实现底层是在正向迭代器的基础上实现的,所以反向迭代中的++对于正向迭代器来说,就是--,一定要区分开这个。再就是“->”的重载其实是为了以防万一,防止val的值是一种类,这样的话就可以访问这个类的值了。

以上就是本篇的内容,如果对你们有帮助的话,希望点一下赞!谢谢支持!文章来源地址https://www.toymoban.com/news/detail-672950.html

到了这里,关于STL之list模拟实现(反向迭代器讲解以及迭代器失效)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++STL】list的反向迭代器

    list的反向迭代器 reverse.h list.h test.cpp 疑问1:为什么在迭代器当中不需要写深拷贝、析构函数 1、因为迭代器就是希望做到浅拷贝,就是需要拿到地址而不是值,因为迭代器的修改是会影响对象中的内容的 2、因为迭代器并没有申请额外的空间,所以不需要析构,如果写了析构

    2024年02月12日
    浏览(37)
  • 【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们要写出一个通用的反向迭代器模拟而且在保证代码简介不繁琐的的情况下,一定程度上使用我们自己模拟的已经封装好的iterator迭代器可以简化许多步骤,首先我们要知

    2024年02月14日
    浏览(55)
  • [STL-list]介绍、与vector的对比、模拟实现的迭代器问题

     list的底层是 带头双向链表 结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 与其他的序列式容器相比(array,vector,deque),list通常 在任意位置进行插入、移除元素的执行效率更好 list最大的缺陷是 不支持任意位

    2024年04月15日
    浏览(95)
  • 深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)&&模拟实现正反向迭代器【容器适配器模式】

    1.一个模板参数 在模拟实现list之前,我们要理解list中的迭代器是如何实现的。 在vector中迭代器可以看成一个指针,指向vector中的数据。它的解引用会访问到具体的数据本身,++会移动到下一个数据位置上去,这些都是因为vector具有天生的优势:空间上是连续的数组,这样指

    2024年02月15日
    浏览(45)
  • 【C++】STL——list的模拟实现、构造函数、迭代器类的实现、运算符重载、增删查改

    list使用文章 析构函数   在定义了一个类模板list时。我们让该类模板包含了一个内部结构体_list_node,用于表示链表的节点。该结构体包含了指向前一个节点和后一个节点的指针以及节点的值。在list中保存了链表的头节点指针和链表长度大小。       因为list的底层实现

    2024年02月14日
    浏览(49)
  • 【C++进阶(五)】STL大法--list模拟实现以及list和vector的对比

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本篇文章立足于上一篇文章: list深度剖析(上) 请先阅读完上一篇文章后再阅读这篇文章! 本章重点: 本章着重讲解list的模拟实现 list模拟实

    2024年02月09日
    浏览(53)
  • 【C++】vector模拟实现+迭代器失效

    铁汁们,今天给大家分享一篇vector模拟实现 + 迭代器失效,来吧,开造⛳️ 指向最后一个空间的下一个位置 💡 iterator _endofstorage 指向存储第一个有效数据空间的位置 💡 iterator _start 指向存储最后一个有效数据空间的下一个位置 💡 iterator _finish 在成员变量声明处给缺省值,

    2024年02月21日
    浏览(36)
  • [C++历练之路]优先级队列||反向迭代器的模拟实现

    W...Y的主页 😊  代码仓库分享💕 🍔前言: 在C++的宇宙中,优先队列似乎是一座巨大的宝库,藏匿着算法的珍宝。而就在这片代码的天空下,我们不仅可以探索优先队列的神奇,还能够揭开反向迭代器的神秘面纱。让我们一同踏入这个编程的探险之旅,在这里,我们将用C

    2024年02月04日
    浏览(50)
  • C++ [STL容器反向迭代器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 我们知道STL大部分容器都有迭代器,迭代器又分为正向迭代器和反向迭代器,对于正向迭代器以及实现前面我们已经了解了不少,而反向迭代器的设计思想是 适配器模式 ,本节我们介绍反向迭代器的实现! 适配器是把一个类的接

    2024年02月11日
    浏览(58)
  • stl中的list模拟实现

    首先我们要清楚list是一个带头双向循环的链表。 在下面代码中我们用到了 模板 ,并且用的是 struct 没有用 class ,这是因为我们使用struct时相当于 这一个类是公开的 ,当然我们也可以使用class但是得使用友元函数比较麻烦。 我们可以查看stl的源码进行查看,如下: 我们可以

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包