码迷,mamicode.com
首页 > 其他好文 > 详细

vector源码1(参考STL源码--侯捷)

时间:2018-09-10 11:11:36      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:orm   init   storage   ati   n+1   bool   turn   reference   执行   

vector源码1(参考STL源码--侯捷)

vector源码2(参考STL源码--侯捷)

vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效

vector概述

Vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间纳入新元素,vector的使用效率,关键在于其对大小的控制以及重新配置时的元素迁移效率。

Vector定义摘要

template <class T,class Alloc=alloc>//allocSGI STL的空间配置器

class vector

{

public:

    typedef T   value_type;

    typedef value_type*  pointer;

    typedef value_type*  iterator;

    typedef value_type&  reference;

    typedef size_t   size_type;

    typedef ptrdiff_t       difference_type;

 

protected:

    typedef simple_alloc<value_type,Alloc> data_allocator;//simple_allocSGI STL的空间配置器

 

    iterator start; //表示目前使用空间的头

    iterator finish; //表示目前使用空间的尾

    iterator end_of_storage; //表示目前可用空间的尾

 

    void insert_aux(iterator position,const T& x);//插入元素,保护类型,对象不可调用

    void deallocate(){

        if(start)

            /*vector再分配空间为其原始可容纳空间的一倍,deallocate()函数如下:

             *static void deallocate(T *p,size_t n)

                {if(0!=n) Alloc::deallocate(p,n*sizeof(T));}

              */

            data_allocator::deallocate(start,end_of_storage-start);

    }

    void fill_initialize(size_type n,const T& value){//用于vector初始赋值

        start=allocate_and_fill(n,value);

        finish=start+n;

        end_of_storage=finish;

    }

 

public:

    iterator begin(){return start;}//头指针

    iterator end(){return finish;}//尾指针

    size_type size() const {return size_type(end()-begin());}//存储元素数量

    size_type capacity() const{return size_type(end_of_storage-begin());}//当前可容纳元素

    bool empty() const{return begin()==end();}//是否为空

    reference operator[](size_type n){return *(begin()+n);}//定位元素,返回第n+1个元素

 

    vector():start(0),finish(0),end_of_storage(0){}//初始化,如:vector<int> v;

    /*size_typeSTL类中定义的类型属性,用以保存任意stringvector类对象的长度,

     以下都为初始化vector,如:vector<int> v(10,1)*/

    vector(size_type n,const T& value){fill_initialize(n,value);}

    vector(int n,const T& value){fill_initialize(n,value);}

    vector(long n,const T& value){fill_initialize(n,value);}

    //explit 防止隐式转换,此时初始化如:vector<int> v(10)

    explicit vector(size_type n){fill_initialize(n,T());}

 

    ~vector(){   /*全局函数,destory()有两个版本,第一个版本接收一个指针,准备将该指针指向的对象析构掉;

            第二个版本就是接收firstlast两个迭代器(如下),将[firstlast]下的对象析构掉。

            在第二个版本下,如果析构对象的析构函数需要执行,会调用一个版本的destory(),否则直接

            析构掉该对象,这里需要用到value_type()进行判断。

        */

        destory(start,finish);

        deallocate();  //vector的成员函数

    }

    reference front(){return *begin();}//返回第一个数

    reference back(){return *(end()-1);}//返回最后一个数

    void push_back(const T& x)//添加元素

    {

        if(finish !=end_of_storage){//是否超出最大可容纳空间

            /*全局函数,construct()接收一个指针p和一个初值value,该函数的用途就是将

              初值value设定到指针锁指的空间上。

            */

            construct(finish,x);

            ++finish;

        }

        else{

            insert_aux(end(),x);  //vector的成员函数

        }

    }

    void pop_back(){

        --finish();

        destroy(finish()); //调用第一类destory()函数,详细见上

    }

    iterator erase(iterator position){//擦除一个元素

        if(position+1!=end())//不是擦除最后一个元素

            copy(position+1,finish,position);//将元素前移,覆盖掉要擦除的元素

        --finish;

        destroy(finish);//销毁最后一个元素

        return position;

    }

    void resize(size_type new_size(),const T& x){

        if(new_size<size())

            earse(begin()+new_size,end());//擦除掉第new_size()个数(0为第一个数)

        else

            insert(end(),new_size-size(),x);//x补全vector长度为new_size()

    }

    void resize(size_type new_size) {resize(new_size,T());}//同上,补全数字为0

    void clear(){earse(begin(),end());}//擦除所有元素

 

protected:

    //配置空间,并填满内存

    iterator allocate_and_fill(size_type n,const T& x){

        iterator result=data_allocator::allocate(n);

        /*全局函数,uninitialized_fill_n()3个参数:

         *迭代器first指向欲初始化空间的地址的起始处

         *初始化空间的大小n

         *初始化的值x

          */

        uninitialized_fill_n(result,n,x);

        return result;

    }

};

vector源码1(参考STL源码--侯捷)

标签:orm   init   storage   ati   n+1   bool   turn   reference   执行   

原文地址:https://www.cnblogs.com/ybf-yyj/p/9609799.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!