详解C++list的使用和实现

list前言:

链表是一种序列容器,允许在序列的任意位置进行常数时间的插入和删除操作,并支持双向迭代。
链表容器采用双向链表实现;双向链表可以将包含的每个元素存储在不同且不相关的存储位置中。通过为每个元素关联前驱元素和后继元素的链接来维护内部排序。
与其他序列容器相比,链表和单链表的一个主要缺点是它们无法通过位置直接访问元素。

目录

list的使用

list接口的使用

构造函数的使用
在这里插入图片描述
其他接口的使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

list双向迭代器的使用在这里插入图片描述

list的实现

在这里插入图片描述

list默认构造函数的实现

在这里插入图片描述

list迭代器的实现

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

其他接口的复用的实现

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

list实现代码如下:

// List的节点类
    template<class T>
    struct ListNode
    {
        ListNode(const T& val = T())
        {
            _prev = _next = nullptr;
            _val = val;
        }
        ListNode<T>* _prev;
        ListNode<T>* _next;
        T _val;
    };


    //List的迭代器类
    template<class T, class Ref, class Ptr>
    class ListIterator
    {
        typedef ListNode<T> Node;
        typedef ListNode<T>* PNode;
        typedef ListIterator<T, Ref, Ptr> Self;
    public:
        ListIterator(PNode pNode = nullptr)
            :_pNode(pNode)
        {}
        T& operator*()
        {
            return _pNode->_val;
        }
        T* operator->()
        {
            return &_pNode->_val;
        }
        Self& operator++()
        {
            _pNode = _pNode->_next;
            return *this;
        }
        Self operator++(int)
        {
            Node* tmp = _pNode;
            _pNode = _pNode->_next;
            return Self(tmp);
        }
        Self& operator--()
        {
            _pNode = _pNode->_prev;
            return *this;
        }
        Self& operator--(int)
        {
            Node* tmp = _pNode;
            _pNode = _pNode->_prev;
            return Self(tmp);
        }
        bool operator!=(const Self& l)
        {
            return _pNode != l._pNode;
        }
        bool operator==(const Self& l)
        {
            return _pNode == l._pNode;
        }
        PNode _pNode;
    };


    //list类
    template<class T>
    class list
    {
        typedef ListNode<T> Node;
        typedef Node* PNode;
    public:
        typedef ListIterator<T, T&, T*> iterator;
        typedef ListIterator<T, const T&, const T*> const_iterator;
    public:
        ///
        // List的构造
        list()
        {
            _pHead = new Node;
            _pHead->_next = _pHead;
            _pHead->_prev = _pHead;
        }
        list(int n, const T& value = T())
        {
            _pHead = new Node;
            _pHead->_next = _pHead;
            _pHead->_prev = _pHead;
            for (int i = 0; i < n; ++i)
            {
                push_back(value);
            }
        }
        list(const list<T>& l)
        {
            _pHead = new Node;
            _pHead->_next = _pHead;
            _pHead->_prev = _pHead;
            for (auto& e : l)
            {
                push_back(e);
            }

        }
        list<T>& operator=(const list<T> l)
        {
            swap(l);

            return *this;
        }
        ~list()
        {
            Node* cur = _pHead->_next;
            Node* tmp = nullptr;
            while (cur != _pHead)
            {
                tmp = cur;
                cur = cur->_next;
                delete tmp;
                cout << "~list()" << " ";
            }
            delete _pHead;
            cout << "~list()" << " ";
        }


        ///
        // List Iterator
        iterator begin()
        {
            return iterator(_pHead->_next);
        }
        iterator end()
        {
            return iterator(_pHead);
        }
        const_iterator begin()const
        {
            return const_iterator(_pHead->_next);
        }
        const_iterator end()const
        {
            return const_iterator(_pHead);
        }


        ///
        // List Capacity
        size_t size()const
        {
            Node* cur = _pHead->_next;
            int i = 0;
            while (cur != _pHead)
            {
                i++;
                cur = cur->_next;
            }
            return i;
        }
        bool empty()const
        {
            if (_pHead->_next == _pHead)
                return true;
            else
                return false;
        }


        
        // List Access
        T& front()
        {
            return _pHead->_next->_val;
        }
        const T& front()const
        {
            return _pHead->_next->_val;
        }
        T& back()
        {
            return _pHead->_prev->_val;
        }
        const T& back()const
        {
            return _pHead->_prev->_val;
        }


        
        // List Modify
        /*void push_back(const T& val) 
        {
            Node* newNode = new Node(val);
            Node* tail = _pHead->_prev;
            tail->_next = newNode;
            newNode->_next = _pHead;
            newNode->_prev = tail;
            _pHead->_prev = newNode;
        }
        void pop_back() 
        {
            Node* cur = _pHead->_prev;
            Node* curPrev = cur->_prev;

            curPrev->_next = _pHead;
            _pHead->_prev = curPrev;
            delete cur;
        }
        void push_front(const T& val) 
        {
            Node* newNode = new Node(val);
            Node* next = _pHead->_next;
            _pHead->_next = newNode;
            newNode->_prev = _pHead;
            newNode->_next = next;
            next->_prev = newNode;
        }
        void pop_front() 
        {
            Node* next = _pHead->_next->_next;
            Node* cur = _pHead->_next;
            _pHead->_next = next;
            next->_prev = _pHead;
            delete cur;
        }*/
        // List Modify
        void push_back(const T& val)
        {
            insert(begin(), val);
        }
        void push_front(const T& val)
        {
            insert(begin(), val);
        }
        void pop_back()
        {
            erase(--end());
        }
        void pop_front()
        {
            erase(begin());
        }
        // 在pos位置前插入值为val的节点
        iterator insert(iterator pos, const T& val)
        {
            Node* cur = pos._pNode;
            Node* prev = cur->_prev;
            Node* newnode = new Node(val);
            prev->_next = newnode;
            newnode->_prev = prev;
            newnode->_next = cur;
            cur->_prev = newnode;
            return iterator(newnode);
        }
        // 删除pos位置的节点,返回该节点的下一个位置
        iterator erase(iterator pos)
        {
            assert(pos != end());
            Node* cur = pos._pNode;
            Node* prev = cur->_prev;
            Node* next = cur->_next;
            prev->_next = next;
            next->_prev = prev;
            delete cur;
            return iterator(next);
        }
        void clear()
        {
            Node* cur = _pHead->_next;
            Node* tmp = nullptr;
            while (cur != _pHead)
            {
                tmp = cur;
                cur = cur->_next;
                delete tmp;
                cout << "~list()" << " ";
            }
        }
        void swap(list<T>& l)
        {
            Node* tmp = _pHead;
            _pHead = l._pHead;
            l._pHead = tmp;
        }
    private:
        PNode _pHead;
    };
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C++中,list和vector是两种不同的容器类型。list是封装链表的容器,以链表形式实现。它不支持[]运算符,对随机访问的速度较慢,因为需要遍历整个链表来找到指定位置的元素。但是在插入数据方面,list的速度很快,因为只需要改变指针的指向而不需要拷贝和移动数据。 而vector是一个封装了动态大小数组的顺序容器。它在堆上分配一段连续的空间,起始地址不变。可以简单地将vector看作是一个能够存放任意类型的动态数组。由于vector拥有一段连续的内存空间,因此支持高效的随机访问。如果需要频繁进行随机访问操作而不在乎插入和删除的效率,可以选择使用vector。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++容器list、vector、map、set区别与用法详解](https://download.csdn.net/download/weixin_38747211/13713865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [一文读懂C++中vector和list的区别](https://blog.csdn.net/caixiaobai_1/article/details/116459551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值