vector的capacity()调用返回vector中最大能够存储的元素个数,也即在下一次需要扩充容量之前能容纳的元素个数。reserve会使容器在必要的时候增长,以便容纳制指定数目的元素。
通过下面的例子,可以很清楚的看到vector的在添加数据的是如何进行内容增长的:
/******************************************************************
* @file vector.cpp
* @version v1.0
* @author ymm
* @date 2013/10/31
* @brief 对比reserve和resize,并描述vector的capaciry的增长方式
* @history
* 1、2013/10/31 author ymm 初步完成
******************************************************************/
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
vector<int> v, u;
v.reserve(5); // 新元素还没有构造, 此时不能用[]访问元素
cout<<v.size()<<"\t" << v.capacity() << "\n"; //0 5
v.resize(10); //新元素创建,因此size的值为10,而且可以输出值,产生的新元素是默认值(int为0)
cout<<v.size()<<"\t" << v.capacity() << "\n"; //10 10
for(int i=0;i<v.size();i++)
{
cout<<v[i]<<endl;
}
cout << "Initial capaciry of u: " << u.capacity() << "\n";
for(int i = 0; i < 40; ++i)
{
u.push_back(i);
cout<<"Now size is :"<<u.size()<<"\t\t" << "Now capacity is :" << u.capacity() << "\n";
}
return 0;
}
//输出:
0 5
10 10
Initial capaciry of u: 0
Now size is :1 Now capacity is :1
Now size is :2 Now capacity is :2
Now size is :3 Now capacity is :4
Now size is :4 Now capacity is :4
Now size is :5 Now capacity is :8
Now size is :6 Now capacity is :8
Now size is :7 Now capacity is :8
Now size is :8 Now capacity is :8
Now size is :9 Now capacity is :16
Now size is :10 Now capacity is :16
Now size is :11 Now capacity is :16
Now size is :12 Now capacity is :16
Now size is :13 Now capacity is :16
Now size is :14 Now capacity is :16
Now size is :15 Now capacity is :16
Now size is :16 Now capacity is :16
Now size is :17 Now capacity is :32
Now size is :18 Now capacity is :32
Now size is :19 Now capacity is :32
Now size is :20 Now capacity is :32
Now size is :21 Now capacity is :32
Now size is :22 Now capacity is :32
Now size is :23 Now capacity is :32
Now size is :24 Now capacity is :32
Now size is :25 Now capacity is :32
Now size is :26 Now capacity is :32
Now size is :27 Now capacity is :32
Now size is :28 Now capacity is :32
Now size is :29 Now capacity is :32
Now size is :30 Now capacity is :32
Now size is :31 Now capacity is :32
Now size is :32 Now capacity is :32
Now size is :33 Now capacity is :64
Now size is :34 Now capacity is :64
Now size is :35 Now capacity is :64
Now size is :36 Now capacity is :64
Now size is :37 Now capacity is :64
Now size is :38 Now capacity is :64
Now size is :39 Now capacity is :64
Now size is :40 Now capacity is :64
如上所示:capacity的增长方式是不是一个个增长的,其好处就是一次申请足够的内存保证后续可以容纳指定数目的元素。在linux中采用的是2^n这么个公式,即按1,2,4,8,16,32,64这样的规律增长。
扩展阅读: http://blog.csdn.net/sharpbladepan/article/details/592520 《vector的capacity增长方式》
http://www.cnblogs.com/qlee/archive/2011/05/16/2048026.html 《vector的reserve和resize》