繁体   English   中英

重载operator = for std :: vector <>的struct成员

[英]Overloading operator= for struct members of class std::vector<>

说我有以下结构:

struct Parameter {
  double value;
  double error;
};

因此,我通常使用该结构的向量(即.std std::vector<Parameter> ),并且偶尔我想通过使用operator= with在参数向量中设置的向量(但不是错误 )标准的std :: vector,为方便起见。

std::vector<Parameter> vector_of_parameters;
std::vector<double> vector_of values;
....
vector_of_parameters = vector_of_values;

为此,我正在尝试为此结构重载operator= ,如下所示:

std::vector<Parameter> operator=(const std::vector<double>& v) {
  this->clear();
  for (const auto& i:v) {
    Parameter p;
    p.value = i;
    this->push_back(p);
  }
  return *this;
}

但是这将返回一个错误,说std :: vector operator =(const std :: vector&v)必须是非静态成员 因此,如果我理解正确,我必须将其定义为运算符的成员函数:

std::vector<Parameter>::operator=(const std::vector<double>& v) {
  this->clear();
  for (const auto& i:v) {
    Parameter p;
    p.value = i;
    this->push_back(p);
  }
  return *this;
}

现在的错误是使用模板<>语法 ,但我没有真正看到它,或者理解它,并且不知道我还能做什么。

你不能重载std::vector的赋值运算符。 operator =必须是一个成员函数,你只是不能将一个成员函数添加到std::vector

你可以做的是创建一个方便的函数,比如create_parameters ,它接受一个std::vector<double>并返回一个std::vector<Parameter> 那看起来像

std::vector<Parameter> create_parameters(std::vector<double> const& params)
{
    std::vector<Parameter> ret(params.size());
    std::transform(params.begin(), params.end(), ret.begin(),
                   [](auto value) { return Parameter{value, 0}; });
    return ret;
}

接着

vector_of_parameters = vector_of_values;

会成为

vector_of_parameters = create_parameters(vector_of_values);

我认为从std::vector<double>创建std::vector<Parameter>的另一种简单方法是定义一个接受Parameter::value参数构造函数Parameter(double value)

#include <vector>
#include <optional>

struct Parameter
{  
    double value;
    std::optional<double> error;

    explicit Parameter(double v) : value(v)
    {}
};

然后你可以使用range-constructor ,如下所示:

DEMO

std::vector<Parameter> v_of_parameters(v_of_values.cbegin(), v_of_values.cend());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM