2010-11-11 60 views
3

我有一段代碼這產生一個std ::矢量< T>與已知大小:push_back()總是增加一個向量的大小嗎?

std::vector<T> vectorOfTs(n); 

是否調用的push_back增加大小爲n + 1?

vectorOfTs.push_back(T()); 
+1

您將內存分配作爲標記包含在內;你能否詳細說明你期望什麼以及在這方面讓你感到困惑? – 2010-11-11 10:17:45

回答

19

是;請注意0​​與vector<T>.size()不同。後者表示當前在向量中的元素的數量,而前者表示適合當前爲向量的內部緩衝區分配的空間的項目的數量。

4

是的。如果您想要預留空間,請撥打reserve(),例如:

std::vector<T> vectorOfTs; 
vectorOfTs.reserve(n); 
// now size() == 0, capacity() >= n 

vectorOfTs.push_back(T()); 
// now size() == 1 
+1

你的答案似乎有點模糊,充其量。 'reserve'將*不*改變大小,它只是保留內存(因此可能會改變'容量')。 – GManNickG 2010-11-11 10:01:28

+0

嗯真的嗎?我提出這是一個不同的選擇,如果OP的意圖是預先分配一個大小爲n的向量的內存而不是有一個n默認構造的向量Ts,他可以使用'reserve()',但主要答案是「是」。 – Nim 2010-11-11 10:12:07

+1

你在這裏的99%我試圖編輯並刪除GMan提到的歧義。 (原來的問題對預期內容和分配方面有些混淆是模糊的。) – 2010-11-11 10:14:40

8

差不多。如果沒有例外,則size()將增加。

push_back(T())還可以扔在不同階段的異常:看here,或草率:

  • T()建設,在這種情況下,以push_back沒有呼叫發生,並且size()不受影響

  • 如果vector需要增加的容量,可能會拋出,在這種情況下size()不受影響

  • vector元件將被複制或使用std::allocator_traits<A>::construct(m, p, v);舉動構造,如果Astd::allocator<T>,那麼這將調用以展示位置new,如通過::new((void*)p) T(v):如果任何的,這將引發的vectorsize()未受影響,除非**** * **

    • 此舉構造不noexcept並不會拋出:在這種情況下,效果是不確定的
  • 向量更新的就完成了 - size()將遞增和值w生病是在vector(即使T::~T()

0

是。

std::vector<T> vectorOfTs(n); 

在上面的語句,其實你正在構建「N」類型T的新實例的數量(即默認構造函數T()將被觸發每次)。現在vectorOfTs包含n個元素。上述語句將調用以下版本的矢量構造函數。

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

所以,當你推回其他元素爲載體,載體的大小將是n + 1。