2017-02-16 37 views
0

我relativly新的C++,這可能是一個愚蠢的問題,但我想了解目前rValuelValue引用,這來到我的腦海:C++映射拷貝性病到矢量::移動

假設我們有一個映射(來自數據庫或其他),我們想要將它的所有值複製到一個向量中。

void insertItems(std::vector<std::string>& v) 
{ 
    std::map<int, std::string> names = loadFromDb(); 

    for (auto& kv : names) 
    { 
     v.push_back(std::move(kv.second)); 
    } 
} 

在這裏使用std::move是否正確? std::string提供了一個移動構造函數,(可能不適用於字符串,但對於較大的對象)移動構造函數比複製構造函數快得多。另外我們知道,我們不使用其他地方的地圖項目,只要我們離開函數,它們就會超出範圍。我的推定是否正確?

我看不出在我的思想中有矛盾,但這是一個複雜的話題,我害怕錯過什麼。 P.S .:我認爲問題的名稱不是最好的。如果你有一個更好的人可以隨意編輯它。

+3

實施是否正確。 'v.reserve'是另一個優化。 – Jarod42

+1

哦,記住'v'不是一個指針。 –

+0

哦,是的,謝謝你,你是絕對正確的。我糾正了 – Cilenco

回答

5

在這裏使用std::move是否正確?

如果您確定將來不會訪問移動的值,那麼是的。


你也可能要使用std::vector::reserve預分配在v所需的空間。

v.reserve(v.size() + names.size()); 
+2

我認爲你的意思是'v.reserve(v.size()+ names.size());'因爲'v'最初可能不是空的。 – emlai

+0

@tuple_cat:好點,謝謝! –

+0

如果我在每次插入新值時都不使用「保留」,將會創建一個向量的副本? – Cilenco

3

在這裏使用std::move是否正確?

是的。代碼看起來很好。

1

在這種情況下,如果您顯示,那麼yes移動將會很好,因爲您以後不會使用該地圖或其值。

如果地圖不是一個值(如果它是一個引用),或者您需要稍後使用它的值,那麼這是錯誤的。