快速問題。假設我聲明瞭一個大小爲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]?
快速問題。假設我聲明瞭一個大小爲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]?
在這些語句之後,其容量是實現定義的。 (請注意,是從它的大小不同。)
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.
注意C++ 03標準23.2.4/1要求'vector's「支持**(攤銷)的恆定時間**最後的插入和擦除操作」,因此實際上容量通常擴大一個因子兩個'push_back()'需要更多空間。 –
好的。謝謝。我不知道它會填滿20 0的。這真的會搞亂我的程序。我不知道爲什麼我沒有想到只是沒有指定尺寸,看到它們是如何動態的,這就是我需要的。代表我的名義。 – iaacp
push_back
增加std::vector
的大小,並把新的元素在vector
背面(其他容器也有push_front
方法做同樣的事情在前面爲好)。
然而,vector
的大小和容量之間存在差異。 大小指的是現在有多少項目實際上在vector
中; 容量指的是vector
在不重新分配內存的情況下可以保存的項目總數。如果您知道要添加多個元素並且不想逐漸增加vector
,則可以使用reserve()
內存。
好吧,所以push_back不會增加容量,對吧?除非該矢量已經滿負荷運行。 – iaacp
正確,但不一定會增加容量。我只提到它,因爲'std :: vector'經歷了區分的困難,所以重要的是保持術語直接,特別是在閱讀'std :: vector'的文檔時。 –
作爲矢量不是空但是具有尺寸20的(包含20種元素)以及你push
2元素到back
,現在包含22個元素。但是新元素並不放置在索引19和20,而是20和21.
如果您確實只想爲矢量保留足夠的內存以容納20個元素(實際上不包含任何元素),以防止代價高昂的重新分配,則應該調用
std::vector<int> myVector;
myVector.reserve(20);
在這種情況下,向量仍是空的,但它具有足夠的內存來添加至少20個元件(使用push_back
,例如),而無需重新分配其內部的存儲空間。在這種情況下,矢量僅包含您需要的兩個元素push
ed _back
。
非常有幫助,謝謝。基本上我想要做的是創建一個向量,並且只添加元素到最後。我並沒有想到,我甚至不必首先給出尺寸,因爲矢量是動態的。謝謝! – iaacp
size
是矢量容器中元素的數量。capacity
是所分配的存儲空間push_back
的大小有效地被一個,這將導致內部分配的存儲的重新分配,如果矢量大小爲等於該呼叫之前的向量容量增加了矢量大小。完美。謝謝! – iaacp
好,vector
有成員函數push_back
。其他序列如deque
有push_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
不提供像deque
和vector
這樣的索引。
然而,假設一個矢量比它的實際尺寸有更大的容量。向其中添加元素時,不需要分配額外的內存。它只有在容量等於大小的情況下才會這樣做。在許多編譯器上,新的容量將是舊容量的兩倍。分配後,它將複製新位置中的所有元素。但是,這種行爲在內存方面可能很昂貴。
push_back
將增加矢量的容量到至少新矢量的大小,但可能(也許)更大一些。
由於push_back
需要在O(1)攤銷時間內運行,因此每次重新分配的時間將是舊容量的某個倍數。在一個典型的實現中,倍數是2.
但是確切的容量增加沒有指定。如果您需要精確控制容量,請使用reserve
。
...
重讀你的問題,我不知道你理解向量的大小和容量之間的差異。大小是元素的數量。容量是在不執行重新分配的情況下矢量可以容納的元素的數量。也就是說,您可以在重新分配之前調用capacity() - size()元素。
在你的例子中,5和14分別出現在myVector [20]和myVector [21]。
對。我不明白的是矢量在創建它們時不需要容量,這就是它們的重點 - 它們是動態的,對吧?所以給他們一個初始能力是沒有意義的。 – iaacp
@iaacp:不,這不是毫無意義的。如果您事先知道您計劃將多少東西放入向量中,但在初始化向量時您手邊沒有實際的東西,那麼您可以「預留」一個量以便「向量」不會必須做任何重新分配。 –
@iiacp:如果你真的關心重新分配,這並不毫無意義。重新分配(a)需要時間並且(b)使向量內的元素的引用/指針無效。 'reserve'可以讓你設置容量以避免未來重新分配。請注意,您的示例設置矢量的_size_,而不是_capacity_。您正在創建20個未初始化整數的向量。 – Nemo
不要猶豫,實際嘗試這種* *自己。 –
歡迎來到StackOverflow,我希望你閱讀[FAQ](http://stackoverflow.com/faq#howtoask)。 –