2011-10-15 38 views
5

快速問題。假設我聲明瞭一個大小爲20的向量。然後我想使用push_back向它添加一些整數。在C++中,矢量函數push_back會增加空數組的大小嗎?

vector<int> myVector(20); 
myVector.push_back(5); 
myVector.push_back(14); 

我的矢量現在的容量是22還是20呢? 5和14分別加入指數[19]和[20]中?還是他們在[0]和[1]?

+13

不要猶豫,實際嘗試這種* *自己。 –

+0

歡迎來到StackOverflow,我希望你閱讀[FAQ](http://stackoverflow.com/faq#howtoask)。 –

回答

11

在這些語句之後,其容量是實現定義的。 (請注意,是從它的大小不同。)


vector<int> myVector(20); 

這將創建充滿具有二十0的向量。它的大小正好是二十,其容量至少有二十。它是否恰好爲20是實現定義的;它可能會有更多(實際上可能不會)。

myVector.push_back(5); 

在此之後,數組的第二十一個元素爲5,並且容量再次被實現定義。 (如果容量已經準確20之前,它現在在未指定的方式增加。)

myVector.push_back(14); 

同樣地,現在該陣列的第二十二元件爲14,容量爲實現定義的。


如果你想保留的空間,而不是插入的元素,你會做這樣的:

vector<int> myVector; 
myVector.reserve(20); // capacity is at least twenty, guaranteed not 
         // to reallocate until after twenty elements are pushed 

myVector.push_back(5); // at index zero, capacity at least twenty. 
myVector.push_back(14); // at index one, capacity at least twenty. 
+1

注意C++ 03標準23.2.4/1要求'vector's「支持**(攤銷)的恆定時間**最後的插入和擦除操作」,因此實際上容量通常擴大一個因子兩個'push_back()'需要更多空間。 –

+0

好的。謝謝。我不知道它會填滿20 0的。這真的會搞亂我的程序。我不知道爲什麼我沒有想到只是沒有指定尺寸,看到它們是如何動態的,這就是我需要的。代表我的名義。 – iaacp

1

push_back增加std::vector的大小,並把新的元素在vector背面(其他容器也有push_front方法做同樣的事情在前面爲好)。

然而,vector的大小和容量之間存在差異。 大小指的是現在有多少項目實際上在vector中; 容量指的是vector在不重新分配內存的情況下可以保存的項目總數。如果您知道要添加多個元素並且不想逐漸增加vector,則可以使用reserve()內存。

+0

好吧,所以push_back不會增加容量,對吧?除非該矢量已經滿負荷運行。 – iaacp

+0

正確,但不一定會增加容量。我只提到它,因爲'std :: vector'經歷了區分的困難,所以重要的是保持術語直接,特別是在閱讀'std :: vector'的文檔時。 –

1

作爲矢量不是空但是具有尺寸20的(包含20種元素)以及你push 2元素到back,現在包含22個元素。但是新元素並不放置在索引19和20,而是20和21.

如果您確實只想爲矢量保留足夠的內存以容納20個元素(實際上不包含任何元素),以防止代價高昂的重新分配,則應該調用

std::vector<int> myVector; 
myVector.reserve(20); 

在這種情況下,向量仍是空的,但它具有足夠的內存來添加至少20個元件(使用push_back,例如),而無需重新分配其內部的存儲空間。在這種情況下,矢量僅包含您需要的兩個元素push ed _back

+0

非常有幫助,謝謝。基本上我想要做的是創建一個向量,並且只添加元素到最後。我並沒有想到,我甚至不必首先給出尺寸,因爲矢量是動態的。謝謝! – iaacp

3
  • size是矢量容器中元素的數量。
  • capacity是所分配的存儲空間
  • push_back的大小有效地被一個,這將導致內部分配的存儲的重新分配,如果矢量大小爲等於該呼叫之前的向量容量增加了矢量大小。

更多信息:http://www.cplusplus.com/reference/stl/vector/

+0

完美。謝謝! – iaacp

1

好,vector有成員函數push_back。其他序列如dequepush_front

0,1,2,......,最終

加入後:

0,1,2,...,最終,此外,...

你可能還記得:

capacity() returns the number of elements in the vector sufficient, 
without allocating additional memory. 
This number can be greater or equal to size. 

也就是說,你不能在前面或中間添加,因爲vector是專門爲通過索引快速訪問元素。如果要在前面和後面添加,可以使用deque,與vector類似。如果您想添加到前面,後面和任何地方,您可以使用list。請注意,list不提供像dequevector這樣的索引。

然而,假設一個矢量比它的實際尺寸有更大的容量。向其中添加元素時,不需要分配額外的內存。它只有在容量等於大小的情況下才會這樣做。在許多編譯器上,新的容量將是舊容量的兩倍。分配後,它將複製新位置中的所有元素。但是,這種行爲在內存方面可能很昂貴。

1

push_back將增加矢量的容量到至少新矢量的大小,但可能(也許)更大一些。

由於push_back需要在O(1)攤銷時間內運行,因此每次重新分配的時間將是舊容量的某個倍數。在一個典型的實現中,倍數是2.

但是確切的容量增加沒有指定。如果您需要精確控制容量,請使用reserve

...

重讀你的問題,我不知道你理解向量的大小和容量之間的差異。大小是元素的數量。容量是在不執行重新分配的情況下矢量可以容納的元素的數量。也就是說,您可以在重新分配之前調用capacity() - size()元素。

在你的例子中,5和14分別出現在myVector [20]和myVector [21]。

+0

對。我不明白的是矢量在創建它們時不需要容量,這就是它們的重點 - 它們是動態的,對吧?所以給他們一個初始能力是沒有意義的。 – iaacp

+0

@iaacp:不,這不是毫無意義的。如果您事先知道您計劃將多少東西放入向量中,但在初始化向量時您手邊沒有實際的東西,那麼您可以「預留」一個量以便「向量」不會必須做任何重新分配。 –

+0

@iiacp:如果你真的關心重新分配,這並不毫無意義。重新分配(a)需要時間並且(b)使向量內的元素的引用/指針無效。 'reserve'可以讓你設置容量以避免未來重新分配。請注意,您的示例設置矢量的_size_,而不是_capacity_。您正在創建20個未初始化整數的向量。 – Nemo