STL-list类

 list的介绍和使用

         list的介绍

list的介绍list的介绍

        list是双向循环链表

          list的使用 

        构造

list(size_t n,const value_type& val = value_type())构造的list中包含n个值为val的元素
list()构造空list
lis(const list& x)拷贝构造函数
list(inputlerator first,inputlterator last)用[first,list)的区间中元素构造list

int main()
{
	list<int> A;
	list<int> B(5,1);
	list<int> C(B);
	list<int> D(C.begin(),C.end());
	return 0;
}

        迭代器

begin

返回第一个元素的迭代器

end返回最后一个元素的下一个位置的迭代器
rbegin返回最后一个元素的迭代器
rend返回第一个元素的上一个位置的迭代器

begin与end是一组的正向地迭代器 ++向后移动

rbegin与rend是反向迭代器 ++向前移动

int main()
{
	int num[10] = { 1,2,3,4,5,6,7,8,9,10 };
	list<int> a(num,num+10);
	for (auto it = a.begin(); it != a.end(); it++)
	{
		cout << *it << ' ';
	}
	cout << endl;
	for (auto rit = a.rbegin(); rit != a.rend(); rit++)
	{
		cout << *rit << ' ';
	}
	cout << endl;
	for (auto ait : a)
	{
		cout << ait;
	}

	return 0;
}
empty检测list是否为空
size返回list中有效节点数
front返回list地第一个节点中值的引用
back返回list最后一个节点中值的引用

push_front头插
pop_front头删
push_back尾插
pop_back尾删
insert在pos位置插入
erase删除pos位置元素
swap交换元素
clear清空有效元素

int main()
{
	list<int> a;
	a.push_back(1);
	a.push_front(0);
	for (auto it : a)
		cout << it;
	a.pop_front();
	for (auto it : a)
		cout << it;
	a.push_front(3);
	swap(a.front(),a.back());
	for (auto it : a)
		cout << it;
	swap(a.front(), a.back());
	for (auto it : a)
		cout << it;
	a.clear();
	cout << a.size();
	return 0;
}

迭代器失效

只有删除某个节点后,迭代器的位置还指向被删除节点时候才失效 

模拟实现 

(包含迭代器与反向迭代器)

#include<iostream>
using namespace std;


namespace mylist
{
    
    template<class T>
    struct ListNode
    {
        ListNode(const T& val = T()):_val(val),_pPre(nullptr),_pNext(nullptr){}
        ListNode<T>* _pPre;
        ListNode<T>* _pNext;
        T _val;
    };


    
    template<class T, class Ref, class Ptr>
    class ListIterator
    {
        typedef ListNode<T>* PNode;
        typedef ListIterator<T, Ref, Ptr> Self;

    public:
        PNode node()
        {
            return _pNode;
        }
        ListIterator(PNode pNode = nullptr):_pNode(pNode){}
        ListIterator(const Self& l):_pNode(l._pNode){}
        T& operator*()
        {
            return _pNode->_val;
        }
        T* operator->()
        {
            return _pNode;
        }
        Self& operator++()
        {
            _pNode = _pNode->_pNext;
            return *this;
        }
        Self operator++(int)
        {
            Self p = *this;
            _pNode = _pNode->_pNext;
            return Self(p);
        }
        Self& operator--()
        {
            _pNode = _pNode->_pPre;
            return *this;
        }
        Self& operator--(int)
        {
            Self p = *this;
            _pNode = _pNode->_pPre;
            return Self(p);
        }
        bool operator!=(const Self& l) const
        {
            return _pNode != l._pNode;
        }
        bool operator==(const Self& l) const
        {
            return _pNode == l._pNode;
        }
    private:
        PNode _pNode;
    };

    template<class Iterator, class Ref, class Ptr>
    struct Reverse_iterator
    {
        typedef Reverse_iterator<Iterator, Ref, Ptr> Self;

        Reverse_iterator(Iterator it):_it(it){}
        Ref operator*()
        {
            Iterator t(_it);
            return *t;
        }

        Ptr operator->()
        {
            return &(operator*());
        }

        //////////////////////////////////////////////
        // 迭代器支持移动
        Self& operator++()
        {
            Self temp(*this);
            --_it;
            return temp;
        }

        Self operator++(int)
        {
            Self temp(*this);
            --_it;
            return temp;
        }

        Self& operator--()
        {
            ++_it;
            return *this;
        }

        Self operator--(int)
        {
            Self temp(*this);
            ++_it;
            return temp;
        }

        bool operator!=(const Self& l) const
        {
            return _it != l._it;
        }

        bool operator==(const Self& l) const
        {
            return _it != l._it;
        }
        
        Iterator _it;
    };
    
    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;

        typedef Reverse_iterator<iterator, const T&, const T*> const_Reverse_iterator;

        typedef Reverse_iterator<iterator,T&,T*> Reverse_iterator;


    public:

        list()
        {
            CreateHead();
        }

        list(int n, const T& value = T())
        {
            CreateHead();
            while(n--)
            push_front(value);
        }
        template <class Iterator>
        list(Iterator first, Iterator last)
        {
            CreateHead();
            while (first != last)
            {
                push_back(*first);
                first++;
            }
        }
        list(const list<T>& l)
        {
            CreateHead();
            for (auto it : l)
            {
                push_back(it);
            }
        }
        list<T>& operator=(const list<T>& l)
        {
            list(l);
        }
        ~list()
        {
            clear();
            delete _pHead;
            _pHead = nullptr;
        }


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

        Reverse_iterator rbegin()
        {
            return Reverse_iterator(--end());
        }

        Reverse_iterator rend()
        {
            return Reverse_iterator(--begin());
        }

        const_Reverse_iterator rbegin()const
        {
            return const_Reverse_iterator(--end());
        }

        const_Reverse_iterator rend()const
        {
            return const_Reverse_iterator(--begin());
        }

        ///////////////////////////////////////////////////////////////
        // List Capacity
        size_t size()const
        {
            size_t s = 0;
            const_iterator it = this->begin();
            while (it != this->end())
            {
                it++;
                s++;
            }
            return s;
        }
        bool empty()const
        {
            return _pHead == _pHead->_pNext;
        }


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


        ////////////////////////////////////////////////////////////
        // List Modify
        void push_back(const T& val) { insert(end(), val); }
        void pop_back() { erase(--end()); }
        void push_front(const T& val) { insert(begin(), val); }
        void pop_front() { erase(begin()); }
        // 在pos位置前插入值为val的节点
        iterator insert(iterator pos, const T& val)
        {
            PNode tmp = new Node(val);
            tmp->_pNext = pos.node();
            tmp->_pPre = pos.node()->_pPre;

            pos.node()->_pPre->_pNext = tmp;
            pos.node()->_pPre = tmp;
            return iterator(tmp);
        }
        // 删除pos位置的节点,返回该节点的下一个位置
        iterator erase(iterator pos)
        {
            PNode it = pos.node()->_pNext;
            PNode p = pos.node();
            p->_pNext->_pPre = p->_pPre;
            p->_pPre->_pNext = p->_pNext;
            delete p;
            return iterator(it);
        }
        void clear()
        {
            while (_pHead != _pHead->_pNext)
            {
                pop_front();
            }
        }
        void swap(list<T>& l)
        {
            PNode tmp = l._pHead;
            l._pHead = _pHead;
            _pHead = tmp;
        }
    private:
        void CreateHead()
        {
            _pHead = new Node;
            _pHead->_pNext = _pHead;
            _pHead->_pPre = _pHead;
        }
        PNode _pHead;
    };
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值