A vector
有容量和它的大小。容量是已分配內存的元素的數量。大小是實際在矢量中的元素的數量。 A vector
當它的大小爲0時爲空。因此,size()
返回0並且empty()
返回true
。這並沒有說明當時的vector
的容量(這取決於自創建以來對vector
所做的插入和擦除次數)。 capacity()
會告訴你當前的容量 - 也就是vector
必須重新分配其內部存儲空間才能容納更多的元素的數量。
所以,當你構建一個vector
,它具有一定的規模和一定的能力。默認構建的vector
將具有零大小和實現定義的容量。您可以將元素融入vector
自由而不必擔心vector
是否足夠大 - 高達max_size()
- max_size()
是最大容量/大小,一個vector
可以有系統(通常是足夠大,不用擔心)上。每次將項目插入vector
時,如果它具有足夠的容量,則不會將內存分配分配給vector
。但是,如果插入該元素將超過vector
的容量,則會在內部重新分配內存,以便它具有足夠容量來容納新元素以及實現定義數量的新元素(通常, vector
可能會翻倍),並且該元素被插入到向量中。發生這種情況時,您不必擔心增加vector
的容量。它發生在constant amortized time,所以你通常不需要擔心它是一個性能問題。
如果您發現您經常添加到vector
以至於發生許多重新分配,並且這是一個性能問題,那麼您可以撥打reserve()
,這會將容量設置爲至少給定的值。通常情況下,當你很清楚你的vector
可能有多少元素時,你會這樣做。然而,除非你知道它會出現性能問題,否則這可能是一個壞主意。這隻會讓你的代碼複雜化。並且constant amortized time通常會足夠好以避免性能問題。
你也可以用你提到的給定數量的默認構造元素構造一個vector
,但除非你真的想要這些元素,那麼這將是一個壞主意。 vector
應該是這樣的,以便在向其中插入元素時不必擔心重新分配容器(就像您必須使用數組一樣),並且爲了分配內存而默認構建元素是打敗了這一點。如果你真的想這樣做,請使用reserve()
。但是,除非您確定它會提高性能,否則請不要打擾reserve()
。正如在另一個回答中指出的那樣,如果您基於用戶輸入將元素插入到vector
,那麼很可能是I/O的時間成本將遠遠超過爲那些相對於vector
重新分配內存的時間成本罕見的情況下,當它的容量耗盡。
能力相關的功能:
capacity() // Returns the number of elements that the vector can hold
reserve() // Sets the minimum capacity of the vector.
大小相關的功能:
clear() // Removes all elements from the vector.
empty() // Returns true if the vector has no elements.
resize() // Changes the size of the vector.
size() // Returns the number of items in the vector.
是否確定,有可能是一個性能問題,而且它很可能是在那裏? – 2010-04-29 16:19:44
@DavidThornley這不僅僅是一個性能問題,它是一個基本的C++問題。默認值應該是永遠不會創建無效但存在的對象。您不必衡量從「錯誤的方式」到「正確的方式」來證明切換的性能;你必須測量它來證明不切換。 – 2013-01-05 17:19:42