capacity 一般大于size的原因是為了避免 每次增加數(shù)據(jù)時都要重新分配內(nèi)存,所以一般會 生成一個較大的空間,以便隨后的數(shù)據(jù)插入。
1
#include <iostream>
2
#include <vector>
3
using namespace std;
4
5
int main()
6

{
7
vector<int> ivec;
8
cout<<"capacity:"<<ivec.capacity()<<" size:"<<ivec.size()<<endl;
9
//添加10個元素
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個元素
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個元素
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前能允許的最大元素數(shù),也可以理解為預(yù)分配的內(nèi)存空間。例如一個vector<int> v的capacity為5,當插入第6個元素時,vector會realloc,vector內(nèi)部數(shù)據(jù)會復(fù)制到另外一個內(nèi)存區(qū)域。這樣之前指向vector中的元素的指針、迭代器等等均會失效。
max_size屬性和capacity不同,表示STL容器允許的最大元素數(shù),通常,這個數(shù)是一個很大的常整數(shù),可以理解為無窮大。這個數(shù)目與平臺和實現(xiàn)相關(guān),在我的機器上vector<int>的max_size為1073741823,而string的max_size為4294967294。因為max_size很大~所以基本不會發(fā)生元素數(shù)超過max_size的情況,只需知道兩者區(qū)別即可。
設(shè)定capacity
List, Map/Multimap, Set/Multiset, Deque
并不是所有的容器都會發(fā)生realloc,List,Map/Multimap,Set/Multiset的元素在內(nèi)存中散布,不預(yù)分配內(nèi)存,所以不會產(chǎn)生realloc的情況,對于這些容器,其capacity是無意義的,所以這些容器沒有capacity()成員函數(shù),也沒有capacity屬性。
deque雙向隊列情況比較特殊,deque將內(nèi)存分塊,每次分配固定大小的分塊,一個分塊填充滿后開辟新的分塊,也屬于散布-連續(xù)混雜的情況,雖然deque會預(yù)分配內(nèi)存空間,但也不會產(chǎn)生realloc(人家是alloc),所以也不具有capacity屬性。
Vector, String, basic_string<wchar_t>
實際具有capacity屬性的容器只有vector和string,在不同實現(xiàn)下,capacity也不盡相同。在我的機器上,情況如下:
vector<T>
默認構(gòu)造函數(shù) - capacity = 0
使用構(gòu)造函數(shù)vector<T>(n, value=T())指定capacity - capacity = n
string (basic_string<char> )
默認構(gòu)造函數(shù) - capacity = 15
沒有指定capacity的構(gòu)造式
指定了初始字符串的 - capacity = 大于字符串長度且等于n*15-1
basic_string<wchar_t>
默認構(gòu)造函數(shù) - capacity = 7
指定了初始字符串的 - capacity = 大于字符串長度且等于n*8-1
除了通過構(gòu)造式設(shè)定capacity,也可以使用reserve(n)來設(shè)定容器對象的capacity,避免之后的realloc。不過這一過程是只增不減的,如果n小于當前capacity,則reserve(n)無效。
收縮容器的內(nèi)存占用空間
Vector, String, basic_string<wchar_t>
對于vector和string,因為reserve()的效果是只增不減,所以無法通過reserve()來收縮空間。如需收縮內(nèi)存空間,思路如下:
新建一個vector/string
為新建的vector/string填充原容器的內(nèi)容
將原容器的變量名指向新的容器
實際使用中只需要一條語句即可。
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