首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量和移动语义

向量和移动语义
EN

Stack Overflow用户
提问于 2021-10-27 10:07:15
回答 3查看 127关注 0票数 2

示例:

代码语言:javascript
复制
class data
{
public:
    void setMyData(vector<string> sourceData)
    {
        private_data_ = sourceData;
    }

private:
    vector<string> private_data_;
};
EN

回答 3

Stack Overflow用户

发布于 2021-10-27 10:15:03

在C++ stl向量上启用移动语义的

您对移动语义概念有误解。

定义了move构造器的std::vector itself is move constructable。您不需要显式启用它,而是正确使用它。

在函数中

代码语言:javascript
复制
void setMyData(vector<string> sourceData)  // copy 1
{
   private_data_= sourceData; // copy 2
}

您正在执行双重复制。相反,您需要

代码语言:javascript
复制
void setMyData(vector<string> sourceData)  // copy 
{
   private_data_= std::move(sourceData); // move
}

或者你可能想要

代码语言:javascript
复制
void setMyData(vector<string>&& sourceData)  // only accept the rvalue
{
   private_data_= std::move(sourceData); // move
}

对于第二种情况,您可以调用函数

代码语言:javascript
复制
setMyData(std::move(sourceData));
票数 3
EN

Stack Overflow用户

发布于 2021-10-27 10:21:23

我建议使用该函数的2个重载,甚至使用泛型重载:

代码语言:javascript
复制
#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);
}

模板化的比较复杂,因为它使用了一个所谓的转发引用。

票数 2
EN

Stack Overflow用户

发布于 2021-10-27 14:31:41

我的建议如下:

代码语言:javascript
复制
#include <utility>

class data
{
public:
    void setMyData(vector<string> sourceData)
    {
          private_data_ = std::move(sourceData);
    }
        
private:
    vector<string> private_data_;
};

要初始化它,有两种方法:

代码语言:javascript
复制
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

这种技术的好处是,您不必编写多个重载方法,您可以选择传递参数的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69736684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档