自制简易STL vector

来源:互联网 发布:java实现短信发送功能 编辑:程序博客网 时间:2024/05/01 20:19

自己写的vector 没有内存配置器 只是简单的用库函数申请内存 应该会有一些bug 如有发现请及时指出

#include <iostream>#include <cstdlib>#include <algorithm>using namespace std;template<class T>class MyVector{public:    typedef T* iterator;protected:    void destory(iterator x)    {        x->~T();    }    void destory(iterator s,iterator e)    {        iterator temp=s;        for(;temp<e;temp++)        {            destory(temp);        }    }    void construct(iterator t,const T& x)    {        new (t) T(x);///placement new    }    void fill_init(iterator first,iterator last,const T& x)    {        iterator temp=first;        for(;temp<last;temp++)        {            construct(temp,x);        }    }    iterator copy_forward(iterator first,iterator last,iterator pos)///[first,last)所指元素复制到pos为起点 pos>first    {        iterator c1,c2;        c1=last-1;        c2=pos+(last-first)-1;        for(;c1>=first;c1--,c2--)        {            construct(c2,*c1);        }        return pos+(last-first);    }    iterator copy_backward(iterator first,iterator last,iterator pos)///[first,last)所指元素复制到pos为起点 pos<=first    {        iterator c1,c2;        c1=first,c2=pos;        for(;c1<last;c1++,c2++)        {            construct(c2,*c1);        }        return c2;    }public:    iterator begin()const    {        return start;    }    iterator end()const    {        return finish;    }    T& front()const    {        return *start;    }    T& back()const    {        return *(finish-1);    }    T& operator[](int x)const    {        return *(start+x);    }    int size()const    {        return finish-start;    }    int capacity()const    {        return end_of_storage-start;    }    bool empty()    {        return begin()==end();    }    MyVector& operator=(const MyVector& x)    {        this->clear();        int i;        for(i=0;i<x.size();i++)        {            this->push_back(x[i]);        }        return *this;    }    MyVector():        start(0),finish(0),end_of_storage(0)    {    }    explicit MyVector(int n):        start((T*)malloc(sizeof(T)*n)),finish(start+n),end_of_storage(finish)///只申请内存但没有调用构造函数    {        fill_init(start,start+n,T());    }    MyVector(int n,const T& x):        start((T*)malloc(sizeof(T)*n)),finish(start+n),end_of_storage(finish)    {        fill_init(start,start+n,x);    }    ~MyVector()    {        destory(start,finish);        free(start);    }    MyVector( MyVector& x):        start(0),finish(0),end_of_storage(0)    {        this->operator=(x);    }    void push_back(const T& x)    {        if(finish!=end_of_storage)        {            construct(finish,x);            finish++;        }        else        {            int oldsize=size();            int new_size=oldsize==0? 1:oldsize*2;            iterator new_start=(T*)malloc(new_size*sizeof(T));            iterator new_finish=new_start+oldsize;            iterator new_end_of_storage=new_start+new_size;            copy_backward(start,finish,new_start);            destory(start,finish);            free(start);            start=new_start;            finish=new_finish;            end_of_storage=new_end_of_storage;            construct(finish,x);            finish++;        }    }    void insert(iterator pos,const T& x)    {        if(finish!=end_of_storage)        {            copy_forward(pos,finish,pos+1);            finish++;            construct(pos,x);        }        else        {            int oldsize=size();            int new_size=oldsize==0? 1:oldsize*2;            iterator new_start=(T*)malloc(new_size*sizeof(T));            iterator new_finish;            iterator new_end_of_storage=new_start+new_size;            new_finish=copy_backward(start,pos,new_start);            construct(new_finish,x);            new_finish++;            new_finish=copy_backward(pos,finish,new_finish);            destory(start,finish);            free(start);            start=new_start;            finish=new_finish;            end_of_storage=new_end_of_storage;        }    }    iterator erase(iterator first,iterator last)///不释放内存 只调用析构函数    {        copy_backward(last,finish,first);        destory(last,finish);        finish=finish-(last-first);        return first;    }    iterator erase(iterator pos)    {        erase(pos,pos+1);    }    void clear()    {        erase(start,finish);    }    void resize(int new_size,const T& x)    {        if(new_size<size())        {            erase(begin()+new_size,end());        }        else        {            int remain=begin()+new_size-finish;            while(remain--)            {                this->push_back(x);            }        }    }    void resize(int new_size)    {        resize(new_size,T());    }    void pop_back()    {        erase(end()-1);    }    iterator find(const T& x)    {        iterator temp(begin());        for(;temp!=end();temp++)        {            if(*temp==x)            {                break;            }        }        return temp;    }private:    iterator start;    iterator finish;    iterator end_of_storage;};int main(){    MyVector<int> v;    int i,j;    for(i=0;i<10;i++)    {        v.push_back(i);    }    for(i=0;i<v.size();i++)    {        cout<<v[i]<<endl;    }    MyVector<int>::iterator it=v.begin();    it++,it++,it++;    v.erase(v.begin(),it);    cout<<v.size()<<" size.."<<endl;    for(i=0;i<v.size();i++)    {        cout<<v[i]<<".."<<endl;    }    v.insert(v.begin()+3,2);    for(i=0;i<v.size();i++)    {        cout<<v[i]<<"...."<<endl;    }    MyVector<int> v2(v);    //cout<<v2.size()<<"  size"<<endl;    for(i=0;i<v2.size();i++)    {        cout<<v2[i]<<"ssss"<<endl;    }    v2.push_back(1);    v2.push_back(3);    v2.push_back(4);    for(i=0;i<v2.size();i++)    {        cout<<v2[i]<<"multi"<<endl;    }    sort(v2.begin(),v2.end());    v2.resize(unique(v2.begin(),v2.end())-v2.begin());    for(i=0;i<v2.size();i++)    {        cout<<v2[i]<<"......"<<endl;    }    v2.erase(v2.find(4),v2.end());    cout<<"after delete   "<<endl;    for(i=0;i<v2.size();i++)    {        cout<<v2[i]<<endl;    }}


0 0
原创粉丝点击