2016-12-30 48 views
-1

設定器我有類:高效傳遞載體在

class Example 
{ 
    const std::vector<int>& getMyVector() { return myVector; } 
    //void setMyVector 
private: 
    std::vector<int> myVector; 
} 

void methodCreatingNewMyVector(Example& example) 
{ 
    std::vector<int> newMyVector; 
    //some push_backs 
    example.setMyVector(newMyVector); 
} 

如何實現setMyVector方法不可複製載體和使用臨時載體從上面的方法?我不想使用智能指針來存儲myVector。我可以使用移動語義嗎?這個怎麼做?

+2

的std ::讓人浮想聯翩。 – DeiDei

+0

爲什麼不''example.getMyVector()'然後直接使用'methodCreatingNewMyVector'中的目標向量? – Unimportant

+0

對不起。我忘了添加const去getMyVector() – Marcin

回答

4

只需提供一個setMyVector()超載服用右值參考std::vector<int>和移動對象出現,例如:

void setMyVector(std::vector<int>&& newVector) { 
    this->myVector = std::move(newVector); 
} 

很明顯,你會適當地調用這個函數:

example.setMyVector(std::move(newMyVector)); 
+0

你好,你能告訴我爲什麼你需要使參數引用參考? –

+2

@LorenceHernandez:'&&'不是「引用引用」,而是* rvalue引用*。評論可能有點簡潔,介紹C++移動語義,但基本的想法是,你不能將左值(即,你可以以某種方式引用的東西)綁定到右值引用。你*可以*使臨時或左值與臨時對象(例如,使用'std :: move()')綁定到右值引用。結果是:右值引用指示它所引用的對象即將消失,並且可以傳遞該表示。 'setMyVector()'的這個重載傳遞了表示。 –

1

是,您可以明確地移動該矢量不復制它通過調用std::move()。這就引起你的載體右值引用,std::vector構造有專門的構造採取這種類型的優勢:

example.setMyVector(std::move(newMyVector)); 

確保在setMyVector()索要右值參考:

void setMyVector (std::vector<int> && vec) 
            ^^rvalue reference 
+0

如果setMyVector沒有將參數作爲一個R值ref,std :: move不會做太多 – RyanP

+0

@RyanP mhm,正在編輯。 –

+0

@RyanP:實際上,'setMyVector()'也可以通過值*來表示參數,因爲它可以避免由於複製影響而複製/移動。然而,對於類似上面的類,我寧願有一個特殊的左值分配,可能重用現有的內存。 –