size()指 目前存在的元素?cái)?shù)。            元素個(gè)數(shù)
capacity()指 容器能存儲(chǔ) 數(shù)據(jù)的個(gè)數(shù)      容器 容量
reserve()指定 容器 能存儲(chǔ)數(shù)據(jù)的個(gè)數(shù)
resize()  重新 指定 有效元素的個(gè)數(shù) ,區(qū)別與reserve()指定 容量的大小
當(dāng)創(chuàng)建空容器時(shí), 容量(capacity)為 0;當(dāng)用完時(shí),增加原容量的 1/2 (各編譯器 可能存在差異  vs2010是這樣的,mingw則 增加原容量 )--適用如 vector這種 元素連續(xù)存儲(chǔ)的容器, 如為list則不同。
capacity 一般大于size的原因是為了避免 每次增加數(shù)據(jù)時(shí)都要重新分配內(nèi)存,所以一般會(huì) 生成一個(gè)較大的空間,以便隨后的數(shù)據(jù)插入。
 1#include <iostream>
 2#include <vector>
 3using namespace std;
 4 
 5int main()
 6{
 7    vector<int> ivec;
 8    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
 9//添加10個(gè)元素
10    for(int i = 0; i < 10++i)
11    {
12        ivec.push_back(i);
13        cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
14    }

15//將容量用完
16    while(ivec.size() != ivec.capacity())
17        ivec.push_back(0);
18    //添加1個(gè)元素
19    cout<<"size = capacity. insert one element\n";
20    ivec.push_back(0);
21    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
22 
23    ivec.reserve(100);
24    cout<<"reserve capacity 100\n";
25    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
26 
27    //將容量用完
28    while(ivec.size() != ivec.capacity())
29        ivec.push_back(42);
30        //添加1個(gè)元素
31    cout<<"size = capacity. insert one element\n";
32    ivec.push_back(0);
33    cout<<"capacity:"<<ivec.capacity()<<"  size:"<<ivec.size()<<endl;
34 
35    system("pause");
36    return 0;
37}

38

 
2. capacity - 容器的成員函數(shù)capacity()取得

max_size - 容器的成員函數(shù)max_size()取得

STL容器的capacity屬性,表示STL在發(fā)生realloc前能允許的最大元素?cái)?shù),也可以理解為預(yù)分配的內(nèi)存空間。例如一個(gè)vector<int> v的capacity為5,當(dāng)插入第6個(gè)元素時(shí),vector會(huì)realloc,vector內(nèi)部數(shù)據(jù)會(huì)復(fù)制到另外一個(gè)內(nèi)存區(qū)域。這樣之前指向vector中的元素的指針、迭代器等等均會(huì)失效。

max_size屬性和capacity不同,表示STL容器允許的最大元素?cái)?shù),通常,這個(gè)數(shù)是一個(gè)很大的常整數(shù),可以理解為無(wú)窮大。這個(gè)數(shù)目與平臺(tái)和實(shí)現(xiàn)相關(guān),在我的機(jī)器上vector<int>的max_size為1073741823,而string的max_size為4294967294。因?yàn)閙ax_size很大~所以基本不會(huì)發(fā)生元素?cái)?shù)超過(guò)max_size的情況,只需知道兩者區(qū)別即可。

設(shè)定capacity

List, Map/Multimap, Set/Multiset, Deque

并不是所有的容器都會(huì)發(fā)生realloc,List,Map/Multimap,Set/Multiset的元素在內(nèi)存中散布,不預(yù)分配內(nèi)存,所以不會(huì)產(chǎn)生realloc的情況,對(duì)于這些容器,其capacity是無(wú)意義的,所以這些容器沒(méi)有capacity()成員函數(shù),也沒(méi)有capacity屬性。

deque雙向隊(duì)列情況比較特殊,deque將內(nèi)存分塊,每次分配固定大小的分塊,一個(gè)分塊填充滿后開辟新的分塊,也屬于散布-連續(xù)混雜的情況,雖然deque會(huì)預(yù)分配內(nèi)存空間,但也不會(huì)產(chǎn)生realloc(人家是alloc),所以也不具有capacity屬性。

Vector, String, basic_string<wchar_t>

實(shí)際具有capacity屬性的容器只有vector和string,在不同實(shí)現(xiàn)下,capacity也不盡相同。在我的機(jī)器上,情況如下:

vector<T>

默認(rèn)構(gòu)造函數(shù) - capacity = 0

使用構(gòu)造函數(shù)vector<T>(n, value=T())指定capacity - capacity = n

string  (basic_string<char> )

默認(rèn)構(gòu)造函數(shù) - capacity = 15

沒(méi)有指定capacity的構(gòu)造式

指定了初始字符串的 - capacity = 大于字符串長(zhǎng)度且等于n*15-1

 basic_string<wchar_t>

默認(rèn)構(gòu)造函數(shù) - capacity = 7

指定了初始字符串的 - capacity = 大于字符串長(zhǎng)度且等于n*8-1

 

除了通過(guò)構(gòu)造式設(shè)定capacity,也可以使用reserve(n)來(lái)設(shè)定容器對(duì)象的capacity,避免之后的realloc。不過(guò)這一過(guò)程是只增不減的,如果n小于當(dāng)前capacity,則reserve(n)無(wú)效。

 

收縮容器的內(nèi)存占用空間

Vector, String, basic_string<wchar_t>

對(duì)于vector和string,因?yàn)閞eserve()的效果是只增不減,所以無(wú)法通過(guò)reserve()來(lái)收縮空間。如需收縮內(nèi)存空間,思路如下:

新建一個(gè)vector/string

為新建的vector/string填充原容器的內(nèi)容

將原容器的變量名指向新的容器

實(shí)際使用中只需要一條語(yǔ)句即可。

    vector<int> v(10, 5);
    v.reserve(20);
    vector<int>(v).swap(v);

 
3.參考:http://www.cnblogs.com/SelaSelah/archive/2012/05/30/2526736.html
          http://blog.csdn.net/youxin2012/article/details/9213539