现在的位置: 首页 > 综合 > 正文

C++中vector容器的内存管理

2017年12月19日 ⁄ 综合 ⁄ 共 1127字 ⁄ 字号 评论关闭

vector是类模板,某种程度上可以看做是数组的升级版,但创建后仍可以改变大小。甚至《C++ primer(第4版)》中还有这样子的说法:“从技术上说,在原来为空的vector容器上n次调用push_back函数,从而创建拥有n个元素的vector容器,其执行时间永远不能超过n的常量倍。”

大家也可能都知道,vector会为可能添加的元素预留空间,但是预留空间总会进行么?今天做了一个测试,跟大家分享一下结果。

1、初始化时是不会多分分配内存的。此时size()恒等于capacity()。原因是也许根本就没有增加元素的需求,多分配内存纯粹是浪费。

2、首次调用push_back()后,因为没有多余的空间存放添加的元素,此时将内存加倍。具体来说,若添加之前的size()等于n,则调用push_back()后,capacity()变成2n。

3、以后再调用push_back(),若空间够用,则直接添加,当不够用时,再次加倍空间。

3、调用insert()情况类似,但注意确保迭代器有效。

测试代码如下:

#include 
#include 
using namespace std;
using std::vector;

int main()
{
    vector ivec;
    vector ivec1(3);
    cout<<"empty vector"<<endl;
    cout<<"size:"<<ivec.size()<<endl;
    cout<<"capacity:"<<ivec.capacity()<<endl;
    
    cout<<"non-empty vector"<<endl;
    cout<<"size:"<<ivec1.size()<<endl;
    cout<<"capacity:"<<ivec1.capacity()<<endl;
  
    cout<<"****push_back()*****"<<endl;
    for (int i=1;i!=20;i++)
  	{
  		ivec.push_back(i);
  		cout<<i<<"\t"<<"size:"<<ivec.size()<<"\t"
            <<"capacity:"<<ivec.capacity()<<endl;
  	} 
  	
  	
    cout<<"****insert()*****"<<endl;
    vector::iterator iter=ivec1.begin();
    for(vector::size_type j=0;j!=20;j++)
    {
    	ivec1.insert(iter,j);
    	cout<<j<<"\t"<<"size:"<<ivec1.size()<<"\t"
            <<"capacity:"<<ivec1.capacity()<<endl;
    	iter=ivec1.begin();
    }
    return 0;
}


抱歉!评论已关闭.