[英]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 ,如下所示:
std::vector<Parameter> v_of_parameters(v_of_values.cbegin(), v_of_values.cend());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.