说我有以下结构:
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 <> ,但是我看不到它,也不了解它,也不知道我还能做些什么。
答案 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 :
std::vector<Parameter> v_of_parameters(v_of_values.cbegin(), v_of_values.cend());