假設有矢量的矢量:調整外部矢量的大小是否會複製內部矢量?
vector<vector<string> > v;
當外矢量的內部陣列被調整大小(並假設內部數組也必須被重新分配到不同的地址)通過做大量的,例如v.push_back()
,內部向量的內部數組是否也被複制(因爲向量的拷貝構造函數通常複製內部數組),還是C++有一種方法來調整外部向量的大小,而不用複製所有東西?
C++ 11移動構造函數會影響這個嗎?這是否依賴於STL實現?
假設有矢量的矢量:調整外部矢量的大小是否會複製內部矢量?
vector<vector<string> > v;
當外矢量的內部陣列被調整大小(並假設內部數組也必須被重新分配到不同的地址)通過做大量的,例如v.push_back()
,內部向量的內部數組是否也被複制(因爲向量的拷貝構造函數通常複製內部數組),還是C++有一種方法來調整外部向量的大小,而不用複製所有東西?
C++ 11移動構造函數會影響這個嗎?這是否依賴於STL實現?
是的,在C++ 03中,當外部向量需要重新分配時,複製內部向量。在C++ 11中,它們被移動。只有在實現正確的情況下,它才取決於實現。如果實施是正確的,這是行爲。
您能否提供參考?我試圖檢查(C++ 11)規範,但找不到任何部分定義了在調整向量大小時如何複製存儲的數據,除了它應該「使用分配器獲得內存」(第23.2.1節/ 7)。 –
是的,如果vector(「outer」)所使用的存儲空間不能被擴展,而是移動到另一個地址,那麼向量中的數據(不管那些數據是什麼)必須也被移動。這就是爲什麼向量的迭代器應該總是被認爲是無效的。 push_back
。
「這就是在例如push_back之後,向量的迭代器總是被認爲無效的原因」 - 除非有'reserve'調用? – Shoe
@Jeffrey,不管是否有儲備要求,如果你超出預留,那麼迭代器就會崩潰。 –
是的我知道外部向量的迭代器應該在外部向量的push_back()後被認爲是無效的,但是如果你在外部向量上調用push_back,內部向量的迭代器也應該被認爲是無效的。 –
作爲一個附註,字符串對象將被重新分配,但不是字符串本身,因爲它們是在實例之間共享的,並且僅在寫入時重新分配(即寫入時拷貝)。所以它並不便宜,但是每個字符緩衝區字符串都不會被複制。 –