天天看點

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》

繼續閱讀