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


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

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

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

    vector源码3(参考STL源码--侯捷):pop_back、erase、clear、insert

    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()有两个版本,第一个版本接收一个指针,准备将该指针指向的对象析构掉;

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

                在第二个版本下,如果析构对象的析构函数需要执行,会调用一个版本的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;

        }

    };

  • 相关阅读:
    学习数据结构的网站
    线程的自动释放、挂起、运行
    centos7 odbc mysql
    c++和c不同
    Linux挂载u盘作为本地yum源安装gcc
    构建基于JAVASCRIPT的移动WEB CMS入门——简介(转载)
    数据库SQL优化大总结之 百万级数据库优化方案
    webgl 刷底色的基本步骤
    前端下载文件流并且获取heads中的filename文件名且解决中文乱码的方法
    Python little knowledge
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9609799.html
Copyright © 2020-2023  润新知