天天看点

vector学习

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》

继续阅读