list容器的實現

今天把List容器給實現了一遍。List容器的實現應該來說是比較簡單的,以前學習C語言的時候就已經是實現過這個數據結構,這次主要是要與STL中的東西相互結合,比如,內存管理使用自己寫的空間配置器,然後使用迭代器來封裝其中的指針。在寫LIST容器時候,我將代碼的整體結構做了很大改動,與前面的有點不同,以前不同的就先不改了,等以後將所有容器實現後,會將所有代碼放上面來。

/*
**
    iterator_list.h
    list的迭代器,繼承基類,實現專屬的迭代器,注意所有迭代器都是封裝了指針,但是所有迭代器都不會用該指針new出一個新對象出來,
只會將已存在的內存空間賦值給它-
*/

#ifndef ITERATOR_LIST_H_INCLUDED
#define ITERATOR_LIST_H_INCLUDED
#include"simple_allocator.h"
#include"my_iterator_base.h"

namespace juine
{
    template<class T>
    struct ListNode
    {
        T data;
        ListNode *next;
        ListNode *prex;
        ListNode(T _data,ListNode *_next=0,ListNode *_prex=0):data(_data),next(_next),prex(_prex){}
    };

    template<class T>
    class Iterator_list
    {
    public:
        typedef ListNode<T>* pointer;
        typedef bidirectional_iterator_tag iterator_category;

        //構造函數和copy構造函數
        Iterator_list(pointer item=0):point(item){}
        Iterator_list(const Iterator_list& iter):point(iter.point){}
        //析構函數
        ~Iterator_list(){}
        Iterator_list operator++()
        {
            point=point->next;
            return *this;
        }
        Iterator_list operator++(int )
        {
            Iterator_list iter=*this;
            this->point=point->next;
            return iter;
        }
        Iterator_list operator+(size_t n)
        {
            Iterator_list iter=*this;
            while(n)
            {
               iter++;
               n--;
            }
            return iter;
        }
        Iterator_list operator--()
        {
            this->point=point->prex;
            return *this;
        }
        Iterator_list operator--(int )
        {
            Iterator_list iter=*this;
            this->point=point->prex;
            return iter;
        }
        Iterator_list operator-(size_t n)
        {
            Iterator_list iter=*this;
            while(n)
            {
               iter--;
               n--;
            }
            return iter;
        }
         //實現*和->的引用,!=
        T& operator*(){ return point->data; }
        pointer operator->(){ return point; }
        bool operator==(Iterator_list iter){    return point==iter.point; }
        bool operator!=(Iterator_list iter){    return point!=iter.point; }
        pointer& get_pointer() { return this->point; }
    protected:
        pointer point;

    };



}

#endif // ITERATOR_LIST_H_INCLUDED

//my_list.h
#ifndef MY_LIST_H_INCLUDED
#define MY_LIST_H_INCLUDED
#include"iterator_list.h"
#include"simple_allocator.h"

namespace juine
{
    template<class T,class Alloc=my_alloc>
    class my_list
    {
    public:
        typedef T value_type;
        typedef T* pointer;
        typedef size_t size_type;
        typedef ListNode<T>  item_type;
        typedef Iterator_list<T> iterator;
        typedef simple_allocator<ListNode<T>,Alloc> data_container;

    private:
        iterator start;
        iterator finish;  //finish並不爲空,而是將其中元素值設爲0,next指針設爲0
        size_type _size;

        //創建節點,並用來初始化節點
        item_type* uninitialized(value_type value,item_type* _prex,item_type* _next)
        {
            item_type* p=data_container::alloc(1);
            p->data=value;
            p->prex=_prex;
            p->next=_next;
            if(_prex!=0)
                _prex->next=p;
            if(_next!=0)
                _next->prex=p;
            return p;
        }
        void fill_uninitialized(size_type n,value_type value)
        {
            item_type* p=uninitialized(value,0,0);
            start.get_pointer()=p;
            while(n>1)
            {
                uninitialized(value,p,0);
                p=p->next;
                n--;
            }
            uninitialized(0,p,0);
            finish.get_pointer()=p->next;

        }
        template<class InputIterator>
        void fill_uninitialized(InputIterator first,InputIterator last)
        {
            item_type* p=uninitialized(*first,0,0);
            start.get_pointer()=p;
            first++;
            _size=1;
            while(first!=last)
            {
                uninitialized(*first,p,0);
                p=p->next;
                first++;
                _size++;
            }
            uninitialized(0,p,0);
            finish.get_pointer()=p->next;
        }
        void deallocate()
        {
            iterator temp;
            cout<<"List容器釋放內存"<<endl;
            while(start!=finish)
            {
                temp=start;
                start++;
                destroy(temp.get_pointer());
                data_container::dealloc(temp.get_pointer());
            }
        }
    public:
        //構造函數,析構函數
        my_list():start(0),finish(0),_size(0){}
        my_list(size_type n,value_type value):_size(n){ fill_uninitialized(n,value);}
        template<class InputIterator>
        my_list(InputIterator first,InputIterator last){  fill_uninitialized(first,last); }
        ~my_list(){ deallocate() ;}

        iterator begin() { return start; }
        iterator end() { return finish; }
        size_type size() { return _size; }
        bool empty() {  return _size==0; }
        value_type& front() {    return *start ;}
        value_type& back() {    return *(finish-1); }
        void push_back(value_type value){   insert(finish,value); }
        void push_front(value_type value){  insert(start,value);  }
        void insert(iterator position,value_type value)
        {
            item_type* temp=position->prex;
            uninitialized(value,temp,position.get_pointer());
            if(position==start)  //插頭插尾不一樣
                start--;
            _size++;
        }
        template<class InputIterator>
        void insert(iterator position,InputIterator first,InputIterator last)
        {
            item_type* temp=position->prex;
            InputIterator _temp=last-1;
            if(first==_temp)   //明顯只插入一個,交給insert(position,value)處理
            {
                insert(position,*first);
                return ;
            }
            int flag=1;
            while(true)
            {
                temp=uninitialized(*first,temp,0);
                if((position==start)&&flag)
                {
                    flag=0;
                    start.get_pointer()=temp;
                }
                first++;
                _size++;
                if(first==_temp)
                {
                    //最後插入的一個元素單獨處理
                    uninitialized(*first,temp,position.get_pointer());
                    _size++;
                    break;
                }
            }

        }
        //刪頭刪尾做的考慮都交給erase
        void pop_back(){    erase(start); }
        void pop_front(){   erase(finish-1); }
        void erase(iterator position)
        {
            if(position==start)  //刪頭刪尾不一樣
            {
                position->next->prex=0;
                start.get_pointer()=position->next;
            }
            else
            {
                position->prex->next=position->next;
                position->next->prex=position->prex;
            }
            destroy(position.get_pointer());
            data_container::dealloc(position.get_pointer());
        }
        void erase(iterator first,iterator last)
        {
            iterator temp=last-1;
            if(first==temp)
            {
                erase(first);
                return ;
            }
            if(first==start)
            {
                last->prex=0;
                start=last;
            }
            else
            {
                last->prex=first->prex;
                first->prex->next=last.get_pointer();
            }
        }
        void clear()
        {
            erase(start,finish);
        }
    };
}

#endif // MY_LIST_H_INCLUDED

測試代碼:

#include<iostream>
#define _USE_ALLOC
#include"my_list.h"
using namespace juine;
using namespace std;
template<class T,class U>
void display(T a,U b)
{  cout<<"hello"<<endl;  }
template<>
void display(size_t a,int b)
{   cout<<"world"<<endl; }
//void  test_list_funtion()
int main()
{
    int a[6]={1,2,3,4,5,6};
    my_list<int> ll(a,a+6);
    ll.erase(ll.begin(),ll.end());

    my_list<int>::iterator iter=ll.begin();
    while(iter!=ll.end())
    {
        cout<<*iter++<<endl;
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章