c++中capacity()函數用法

c++中capacity()函數用法

size()指 目前存在的元素數。 元素個數
capacity()指 容器能存儲 數據的個數 容器 容量
reserve()指定 容器 能存儲數據的個數
resize() 重新 指定 有效元素的個數 ,區別與reserve()指定 容量的大小
當創建空容器時, 容量(capacity)爲 0;當用完時,增加原容量的 1/2 (各編譯器 可能存在差異 vs2010是這樣的,mingw則 增加原容量 )–適用如 vector這種 元素連續存儲的容器, 如爲list則不同。
capacity 一般大於size的原因是爲了避免 每次增加數據時都要重新分配內存,所以一般會 生成一個較大的空間,以便隨後的數據插入。

 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個元素
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}

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

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

STL容器的capacity屬性,表示STL在發生realloc前能允許的最大元素數,也可以理解爲預分配的內存空間。例如一個vector v的capacity爲5,當插入第6個元素時,vector會realloc,vector內部數據會複製到另外一個內存區域。這樣之前指向vector中的元素的指針、迭代器等等均會失效。

max_size屬性和capacity不同,表示STL容器允許的最大元素數,通常,這個數是一個很大的常整數,可以理解爲無窮大。這個數目與平臺和實現相關,在我的機器上vector的max_size爲1073741823,而string的max_size爲4294967294。因爲max_size很大~所以基本不會發生元素數超過max_size的情況,只需知道兩者區別即可。

設定capacity
List, Map/Multimap, Set/Multiset, Deque
並不是所有的容器都會發生realloc,List,Map/Multimap,Set/Multiset的元素在內存中散佈,不預分配內存,所以不會產生realloc的情況,對於這些容器,其capacity是無意義的,所以這些容器沒有capacity()成員函數,也沒有capacity屬性。

deque雙向隊列情況比較特殊,deque將內存分塊,每次分配固定大小的分塊,一個分塊填充滿後開闢新的分塊,也屬於散佈-連續混雜的情況,雖然deque會預分配內存空間,但也不會產生realloc(人家是alloc),所以也不具有capacity屬性。

Vector, String, basic_string<wchar_t>
實際具有capacity屬性的容器只有vector和string,在不同實現下,capacity也不盡相同。在我的機器上,情況如下:

vector
默認構造函數 - capacity = 0
使用構造函數vector(n, value=T())指定capacity - capacity = n

string (basic_string )
默認構造函數 - capacity = 15
沒有指定capacity的構造式
指定了初始字符串的 - capacity = 大於字符串長度且等於n15-1
basic_string<wchar_t>
默認構造函數 - capacity = 7
指定了初始字符串的 - capacity = 大於字符串長度且等於n
8-1

除了通過構造式設定capacity,也可以使用reserve(n)來設定容器對象的capacity,避免之後的realloc。不過這一過程是隻增不減的,如果n小於當前capacity,則reserve(n)無效。

收縮容器的內存佔用空間

Vector, String, basic_string<wchar_t>

對於vector和string,因爲reserve()的效果是隻增不減,所以無法通過reserve()來收縮空間。如需收縮內存空間,思路如下:

新建一個vector/string

爲新建的vector/string填充原容器的內容

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

實際使用中只需要一條語句即可。

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

參考:http://www.cppblog.com/panzhizhou/articles/203772.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章