2016-10-21 77 views
1

這裏我有一個自動分配的std::vector v。現在有沒有辦法從v構造另一個動態分配的std::vector,這樣就沒有複製構造函數的開銷。將自動分配的std :: vector轉換爲動態分配的std :: vector而不需要開銷

std::vector<int> v(3); 
std::vector<int>* v2 = new std::vector<int>(v); 
  1. 發生什麼事時v destrucotor叫?
  2. 有人可以詳細介紹std :: vector的移動構造函數。
  3. 或者我不應該擔心編譯器會爲我優化這個嗎?

我終於想要一個std :: shared_ptr的v2,我可以傳遞給其他函數。

+0

爲什麼你需要這樣做?如果你需要*移動*向量,那麼只需'移動'它。 – NathanOliver

+0

不,不能執行。你正試圖將一個'vector'從一個內存區域移動到另一個區域。但是,您可以使用指針並傳遞指針。 –

+3

主要問題是,爲什麼你首先用'new'創建一個動態分配的'std :: vector'? – ArchbishopOfBanterbury

回答

6

由於您聲明您不希望「複製構造函數的開銷」,這意味着在創建「動態」之後不再需要原始向量。在這種情況下,你可以簡單地做

std::vector<int>* v2 = new std::vector<int>(std::move(v)); 

將使用移動構造函數來構建新的載體。移動矢量的開銷幾乎不存在。

請再次注意,在完成之後,您的原始v處於「從...移開」狀態 - 通常情況下,它不再包含原始數據。您可以將v用於其他目的。並v仍然是可破壞的,其銷燬將不會影響v2

+1

std :: vector :: swap'可以用於Pre C++ 11以及 – Slava

+0

@Ant謝謝,它可以用於任何容器 – Anshuman

+2

@Anshuman任何支持移動語義的容器。所有來自標準C++庫的容器(假設你使用C++ 11或更高版本) – Slava

相關問題