代码之家  ›  专栏  ›  技术社区  ›  elcortegano

重载运算符=对于std::vector类的结构成员<>

  •  3
  • elcortegano  · 技术社区  · 6 年前

    假设我有以下结构:

    struct Parameter {
      double value;
      double error;
    };
    

    所以我通常使用这个结构的向量。 std::vector<Parameter> )和局部我想设置一个向量 价值观 (但不是) 错误 )在参数向量中,使用 operator= 为了方便起见,使用标准的std::vector。

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

    为此,我正试图超载 运算符= 对于此结构,如下所示:

    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;
    }
    

    错误现在表示 与模板的语法<gt; 但我不太明白,也不知道还能做什么。

    2 回复  |  直到 6 年前
        1
  •  5
  •   NathanOliver    6 年前

    不能重载的赋值运算符 std::vector . operator = 必须是成员函数,并且不能将成员函数添加到 STD::载体 .

    你能做的就是做一个方便的功能 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);
    
        2
  •  4
  •   Hiroki    6 年前

    我认为另一种简单的方法 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)
        {}
    };
    

    然后你可以用 范围构造函数 如下:

    DEMO

    std::vector<Parameter> v_of_parameters(v_of_values.cbegin(), v_of_values.cend());
    
    推荐文章