[英]std::vector and move semantics
要在std::vector
上啟用移動語義,我是否需要按值傳遞; 所以編譯器不會復制元素而只是移動它們?
例子:
class data
{
public:
void setMyData(vector<string> sourceData)
{
private_data_ = sourceData;
}
private:
vector<string> private_data_;
};
在 C++ stl 向量上啟用移動語義
您對移動語義概念有誤解。
std::vector
本身是可移動構造的,因為它定義了移動構造函數。 您不需要顯式啟用它,而是正確使用它。
在函數中
void setMyData(vector<string> sourceData) // copy 1
{
private_data_= sourceData; // copy 2
}
你在做雙重復制。 你需要
void setMyData(vector<string> sourceData) // copy
{
private_data_= std::move(sourceData); // move
}
或者你可能想要
void setMyData(vector<string>&& sourceData) // only accept the rvalue
{
private_data_= std::move(sourceData); // move
}
對於第二種情況,你調用函數
setMyData(std::move(sourceData));
我建議要么使用該函數的 2 個重載,要么使用一個通用的重載:
#include <vector>
#include <string>
class data
{
public:
void setMyData(const std::vector<std::string>& sourceData){private_data_=sourceData;}
void setMyData(std::vector<std::string>&& sourceData){private_data_= std::move(sourceData);}
template <typename T>
void genericsetMyData(T&& source) {private_data_ = std::forward<T>(source);}
private:
std::vector<std::string> private_data_;
};
int main() {
class data a,b,c,d;
std::vector<std::string> s1,s2; const std::vector<std::string> s3;
a.setMyData(s1);
b.setMyData(std::move(s2));
c.genericsetMyData(s1);
d.genericsetMyData((std::move(s1)));
d.genericsetMyData(s3);
}
模板化的有點復雜,因為它使用所謂的轉發引用。
我建議如下:
#include <utility>
class data
{
public:
void setMyData(vector<string> sourceData)
{
private_data_ = std::move(sourceData);
}
private:
vector<string> private_data_;
};
要初始化,您有兩種方法:
vector<string> myStrings{"hello", "i am", "stringies"};
data mydata;
// Type 1: Give ownership
mydata.setMyData(std::move(myStrings)); // not a single copy, but myStrings is empty
// Type 2: Copy
mydata.setMyData(myStrings); // Copy once only, and myStrings is still valid
這種技術的好處是您不必編寫幾個重載方法,您可以選擇要傳遞參數的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.