size()指 目前存在的元素數。 元素個數
capacity()指 容器能儲存 資料的個數 容器 容量
reserve()指定 容器 能儲存資料的個數
resize() 重新 指定 有效元素的個數 ,區別與reserve()指定 容量的大小
當建立空容器時, 容量(capacity)為 0;當用完時,增加原容量的 1/2 (各編譯器 可能存在差異 vs2010是這樣的,mingw則 增加原容量 )–適用如 vector這種 元素連續儲存的容器, 如為list則不同。
capacity 一般大於size的原因是為了避免 每次增加資料時都要重新分配記憶體,所以一般會 生成乙個較大的空間,以便隨後的資料插入。
1#include
2#include
3using namespace std;
45int main()
615//將容量用完
16while
(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:"
<<
" size:"
<2223 ivec.
reserve
(100);
24 cout<<
"reserve capacity 100\n"
;25 cout<<
"capacity:"
<<
" size:"
<2627
//將容量用完
28while
(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:"
<<
" size:"
<3435
system
("pause");
36return0;
37}
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
實際具有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
預設建構函式 - capacity = 7
指定了初始字串的 - capacity = 大於字串長度且等於n8-1
除了通過構造式設定capacity,也可以使用reserve(n)來設定容器物件的capacity,避免之後的realloc。不過這一過程是只增不減的,如果n小於當前capacity,則reserve(n)無效。
vector, string, basic_string<
wchar_t
>
對於vector和string,因為reserve()的效果是只增不減,所以無法通過reserve()來收縮空間。如需收縮記憶體空間,思路如下:
新建乙個vector/string
為新建的vector/string填充原容器的內容
將原容器的變數名指向新的容器
實際使用中只需要一條語句即可。
vectorv(10, 5);
v.reserve(20);
vector(v).swap(v);
參考: Vector 中size和 capacity的區別
size是指容器當前擁有元素的個數,而capacity是指容器在必須分配新的儲存空間之前可以存放的元素總數。如vectorivect 10 ivect.capacity 10,ivect.size 0,當你向ivect中插入元素時,只要沒有超過十個,那麼capacity就不變,而size為你插入的元...
C 中sort函式用法
一 為什麼要用c 標準庫里的排序函式 sort 函式是c 一種排序方法之一,學會了這種方法也打消我學習c 以來使用的氣泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間複雜度為n log2 n 執行效率較高!二 c 標準庫里的排序函式的使用方法 i sort函式...
C 中sort函式用法
排序示例 輸入兩個數n,t,其中n是待排的結構體個數,t 0代表用降序排序,t 1表示用公升序排序 例如這樣 例示 jack 70 peter 96 tom 70 smith 67 從高到低 成績 peter 96 jack 70 tom 70 smith 67 從低到高 smith 67 tom ...