示例:
class data
{
public:
void setMyData(vector<string> sourceData)
{
private_data_ = sourceData;
}
private:
vector<string> private_data_;
};发布于 2021-10-27 10:15:03
在C++ stl向量上启用移动语义的
您对移动语义概念有误解。
定义了move构造器的std::vector itself is move constructable。您不需要显式启用它,而是正确使用它。
在函数中
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));发布于 2021-10-27 10:21:23
我建议使用该函数的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);
}模板化的比较复杂,因为它使用了一个所谓的转发引用。
发布于 2021-10-27 14:31:41
我的建议如下:
#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这种技术的好处是,您不必编写多个重载方法,您可以选择传递参数的方式。
https://stackoverflow.com/questions/69736684
复制相似问题