C ++运算符重载将3个向量相加

时间:2018-04-01 17:57:36

标签: c++ oop overloading operator-keyword

现在,这就是我如何在一起添加3个Product类型的向量:

    vector1.insert(std::end(vector1), std::begin(vector2), std::end(vector2));
    vector1.insert(std::end(vector1), std::begin(vector3), std::end(vector3));

如何使用运算符重载(我假设重载+和=运算符)来简化我的代码?产品具有以下属性:

private:
    std::string url;
    double cost;
    std::string name;
    std::string site;

2 个答案:

答案 0 :(得分:0)

操作重载只是一个正常的自由函数或成员函数。

他们并没有什么特别之处。 ("主要是"指代运算符优先级以及operator*解除引用或operator,等内容的一些注意事项。)

以下是使用operator+=append显示他们做同样事情的示例:

#include <iostream>
#include <vector>

using std::begin;
using std::cout;
using std::end;
using std::endl;
using std::ostream;
using std::vector;

struct Product
{
  static int count;
  int i;
  Product() : i{++count} {}
};

static ostream& operator<<(ostream& o, Product const& p)
{
  o << p.i;
  return o;
}

int Product::count = 100;

static void append(vector<Product>& v, vector<Product> const& v2)
{
  v.insert(end(v), begin(v2), end(v2));
}

static vector<Product>& operator+=(vector<Product>& v, vector<Product> const& v2)
{
  v.insert(end(v), begin(v2), end(v2));
  return v;
}

int main()
{
  auto product1 = vector<Product>{};
  product1.push_back(Product{});
  product1.push_back(Product{});
  product1.push_back(Product{});
  product1.push_back(Product{});

  auto product2 = vector<Product>{};
  product2.push_back(Product{});
  product2.push_back(Product{});
  product2.push_back(Product{});
  product2.push_back(Product{});

  auto product3 = vector<Product>{};
  product3.push_back(Product{});
  product3.push_back(Product{});
  product3.push_back(Product{});
  product3.push_back(Product{});

  append(product1, product2);
  product1 += product3;

  char const* sep = "";
  for (auto const& p : product1)
  {
    cout << sep << p;
    sep = " ";
  }
  cout << endl;
}

答案 1 :(得分:-1)

我不会认为标准容器的重载操作是一个好主意。但是,我会编写一个函数来连接一堆向量。拥有C ++ 11,您可以使用std::initializer_list轻松获得可变长度的参数列表。

// your includes ...
#include <initializer_list>

// some code ...

std::vector<Product> concatVectors(std::initializer_list<std::vector<Product>> args)
{
    std::vector<Product> res;
    for (auto v: args) {
        res.insert(std::end(res), std::begin(v), std::end(v));
    }
    return res;
}

然后像这样调用这个函数:

vector1 = concatVectors({vector1, vector2, vector3});

Curly braces初始化std::initializer_list的新实例,对任意数量的向量都有魔力。