2013-12-20 99 views
2

假設有矢量的矢量:調整外部矢量的大小是否會複製內部矢量?

vector<vector<string> > v; 

當外矢量的內部陣列被調整大小(並假設內部數組也必須被重新分配到不同的地址)通過做大量的,例如v.push_back(),內部向量的內部數組是否也被複制(因爲向量的拷貝構造函數通常複製內部數組),還是C++有一種方法來調整外部向量的大小,而不用複製所有東西?

C++ 11移動構造函數會影響這個嗎?這是否依賴於STL實現?

+1

作爲一個附註,字符串對象將被重新分配,但不是字符串本身,因爲它們是在實例之間共享的,並且僅在寫入時重新分配(即寫入時拷貝)。所以它並不便宜,但是每個字符緩衝區字符串都不會被複制。 –

回答

3

是的,在C++ 03中,當外部向量需要重新分配時,複製內部向量。在C++ 11中,它們被移動。只有在實現正確的情況下,它才取決於實現。如果實施是正確的,這是行爲。

+1

您能否提供參考?我試圖檢查(C++ 11)規範,但找不到任何部分定義了在調整向量大小時如何複製存儲的數據,除了它應該「使用分配器獲得內存」(第23.2.1節/ 7)。 –

3

是的,如果vector(「outer」)所使用的存儲空間不能被擴展,而是移動到另一個地址,那麼向量中的數據(不管那些數據是什麼)必須也被移動。這就是爲什麼向量的迭代器應該總是被認爲是無效的。 push_back

+1

「這就是在例如push_back之後,向量的迭代器總是被認爲無效的原因」 - 除非有'reserve'調用? – Shoe

+0

@Jeffrey,不管是否有儲備要求,如果你超出預留,那麼迭代器就會崩潰。 –

+0

是的我知道外部向量的迭代器應該在外部向量的push_back()後被認爲是無效的,但是如果你在外部向量上調用push_back,內部向量的迭代器也應該被認爲是無效的。 –