2011-06-09 96 views
21

我對此有點困惑,這兩者對我來說都是一樣的。 儘管在不同的編譯器上容量和大小可能會有所不同。它如何可能有所不同。它還表示,如果我們內存不足,容量會發生變化。大小vs矢量的容量?

所有這些東西都有點不清楚。

有人可以給出一個解釋(如果可能的話用和實例,或者如果我可以做任何程序的任何測試,以瞭解它)

+0

還檢查了這個答案http://stackoverflow.com/questions/2787397 /什麼最專門的向量容量#答案-2787405。那裏有Java語言,但概念是一樣的。 – rid 2011-06-09 17:39:01

回答

49

大小不允許在多個編譯器之間不同。矢量的大小是它包含的元素的數量,它由您放入矢量的元素數量直接控制。

容量是矢量當前使用的空間量。在引擎蓋下,一個向量只是使用一個數組。矢量的容量是該數組的大小。這總是等於或大於大小。它們之間的差異是可以在引擎蓋下的數組需要重新分配之前添加到矢量中的元素的數量。

你應該幾乎從不關心能力。它的存在是讓具有非常具體的性能和內存限制的人按照自己的意願去做。

+2

+1對我來說很明白,也是額外的imp。信息 - >「你幾乎不應該關心能力,它的存在是讓具有非常具體的表現和記憶限制的人按照自己的意願去做。」謝謝 – munish 2011-06-09 17:54:09

+8

不關心不關心容量。如果你知道你有至少200個物品要存儲在你的矢量中,那麼在建造的時候你會很瘋狂地告訴它。 – 2011-06-09 18:00:31

+2

瘋了嗎?我不一定這樣認爲。我只進行了一些測試,在保留空間的情況下插入了200個int,在保留空間之前我需要重複10萬次以上的性能改進。當然,在保留空間的情況下,性能大約是它的兩倍,但除非你在一個緊密的循環中這樣做,而這是性能瓶頸,否則我不認爲這太瘋狂,不在乎幾個微秒。 – 2011-06-09 18:36:52

21

尺寸:項目目前在向量的數量

容量:在「完整」之前可以在矢量中放入多少物品。一旦填滿,添加新項目將導致分配一個新的,更大的內存塊並將其中的現有項目複製到其中

+1

我會說不分配,但重新分配。因爲向量保證數據在內存中連續佈局,所以不能使用多個運算符'new'返回的內存塊。所以當限制被命中時,向量將分配一個新的內存塊並將現有數據複製到該內存中,然後刪除以前分配的塊。或者,如果它足夠聰明,它將使用'realloc'函數來更加優化。 – 2011-06-09 17:41:43

+0

@Vlad:我假設你在看到我最後的編輯之前發表了評論? – 2011-06-09 17:58:34

5

size()告訴您當前有多少元素。 capacity()告訴你在向量需要爲自己重新分配內存之前可以獲得多大的大小。

容量始終大於或等於大小。你不能索引超出元素#size()-1

4

大小是向量中元素的數量。容量是矢量當前可以容納的元素的最大數量。

16

比方說,你有一個桶。這個桶最多可容納5加侖水,因此其容量爲5加侖。它可能有0到5之間的任何水量,包括0和5。在桶中當前的水量是從矢量的角度來看它的大小。所以如果這個桶是半滿的,它的大小爲2.5加侖。

如果您嘗試向水桶添加更多水並且水會溢出,則需要找到更大的水桶。所以你得到一個容量較大的水桶,並將舊水桶的內容倒入新水桶中,然後加入新水。

容量:Vector /存儲桶可容納的最大數量。 大小:當前在矢量/存儲桶中的東西數量。

+0

你必須是一個instractor。我無法準確理解分配內存的含義,但我現在很明白它究竟意味着什麼。 – snr 2015-08-11 18:24:40

2

尺寸是在載體中存在的元素的數目

容量是,矢量當前正在使用的空間量。

讓我們從一個非常簡單的例子理解:

using namespace std; 

int main(){ 
    vector<int > vec; 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    cout<<"size of vector"<<vec.size()<<endl; 
    cout<<"capacity of vector"<<vec.capacity()<<endl; 
    return 0; 
} 

目前大小爲3, 容量4.

現在,如果我們推回多了一個元素,

using namespace std; 
    int main(){ 
    vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    vec.push_back(1); 
    cout<<"size of vector"<<vec.size()<<endl; 
    cout<<"capacity of vector"<<vec.capacity()<<endl; 
    return 0; 
} 

現在 尺寸爲:4 容量爲4

現在,如果我們試圖在vector插入一個多元素,則大小將成爲5,但能力將成爲8

它發生的基礎上vector的數據類型,這裏在這種情況下vectorint類型的,因爲我們知道int的大小是4字節,所以編譯器會分配4塊內存。當我們嘗試添加第5個元素時,vector::capacity()是我們目前的兩倍。

同樣保持on..for例如:如果我們試圖插入第九元素則vector規模將是9和容量的B16 ..