zoukankan      html  css  js  c++  java
  • Vector动态扩容

    Vector动态扩容

    无聊看了一下Vector的源码

    看看动态扩容怎么实现的

    一.vector的介绍

    首先这玩意是动态的,非常灵活 储存的时候是连续的线性空间,

    插播一个在<STL源码剖析> 中看到的问题, 提出质疑

    原文如下:

      
    所以它的迭代器也是完全可以用普通的指针
    
    比如
    vector<int>::iterator i1;
    vector<shape>::iteraor i2;
    
    i1其实就是int *
    i2其实就是 shape *
        //
    

    但是经过我的实验, 好像不是这样

    先上Vector的数据结构

    class Vector
    {
    	public:
    		iterator start;
    		iterator begin(){return start};
            //目前使用了的空间头
            
    		iterator finish;
    		iterator end(){return finish};		
            //目前使用了的空间的尾
            
            size_type size(){ return size_type(end-start);}
            
            reference front() {return *begin();}
            reference back(){return *(end()-1);}
    		iterator end_of_storage;	//目前可用空间的尾
    		
        	bool empty(){return begin()==end();}
    }
    

    看完觉得真的很简洁 我这里粗略的写了一些而已 够我们后面去理解

    当我们用push_back插入的时候,会检查 还有没有备用的空间 ,如果没有的话

    要经历allocator先按规则分配空间 然后把之前的拷贝过去, 再插入,最后释放原来的空间 这是一个庞大的工程

    分配空间的规则

    {

    如果原本大小为0

    ​ 分配空间为1;

    else

    ​ 分配空间为=原来的*2;

    }

  • 相关阅读:
    IPC之——消息队列
    特殊命令
    面试概念集锦
    守护进程(精灵进程)
    IP SSL HTTPS
    钉钉监控样例
    中间人攻击
    iptables firewalld
    简单暴力高效率的OSM全球地图
    解决ubuntu使用命令sudo apt -get install 安装东西时出现"E: Sub-process /usr/bin/dpkg returned an error code (1) "的错误 问题描述:
  • 原文地址:https://www.cnblogs.com/yahoo17/p/12706376.html
Copyright © 2011-2022 走看看