重载operator =用于类std :: vector <>的结构成员

时间:2019-01-15 14:28:04

标签: c++ vector struct

说我有以下结构:

struct Parameter {
  double value;
  double error;
};

因此,我通常使用该结构的向量(即std::vector<Parameter>),有时我想设置一个 values 的向量(但不是 errors < / em>),通过使用operator=和标准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运算符=(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;
}

错误现在表明带有模板的 syntaxis <> ,但是我看不到它,也不了解它,也不知道我还能做些什么。

2 个答案:

答案 0 :(得分:5)

您不能重载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);

答案 1 :(得分:4)

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