2011-10-11 63 views
11

C++11之前,我已經使用掉期到後,以避免深拷貝費用,如:使用的std ::移動

vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(vector<Object>()); 
    Objects.back().swap(v); 
} 

如何使用std::move移動vObjects避免深拷貝的開銷,而不是swap
我知道這裏有很多解決方法,像多數組或直接插入Objects.back(),但我需要使用std::move的一個示例來了解它。

+2

爲什麼你創建'v'呢?爲什麼不只是將一個空白矢量添加到對象中,然後將Object.back()。push_back()'添加到對象中?這簡化了更多開銷。 – Ayjay

+0

@Ayjay:閱讀問題的其餘部分 – Dani

回答

16
vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(std::move(v)); 
} 
+0

但是,這會在後面留下'v'。我明白'std :: move'應該有點破壞性。 – Dani

+2

@Dani:不要假設。嘗試一下。實際上,閱讀'vector :: vector(vector &&)'的源代碼就足夠了。語義非常接近你的'std :: swap'版本 - 但在一般情況下更優雅,效率更高 – sehe

+0

如果'Object'的默認構造函數不重要,肯定會更高效。 – ildjarn

17
Objects.push_back(std::move(v)); 
+2

+1得到正確的答案並獲得很少的關注 – sehe