C++ 运算符重载将 3 个向量相加
C++ operator overloading adding 3 vectors together
现在这是我将 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;
操作重载只是一个普通的自由函数,或者成员函数。
大多数情况下,它们没有什么特别之处。 ("mostly" 指的是运算符优先级和一些注意事项,例如 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;
}
我不认为标准容器的重载操作是个好主意。但是,我会编写一个函数来连接一堆向量。拥有 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});
花括号初始化 std::initializer_list
的一个新实例,这对任意数量的向量来说就像魔术一样。
现在这是我将 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;
操作重载只是一个普通的自由函数,或者成员函数。
大多数情况下,它们没有什么特别之处。 ("mostly" 指的是运算符优先级和一些注意事项,例如 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;
}
我不认为标准容器的重载操作是个好主意。但是,我会编写一个函数来连接一堆向量。拥有 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});
花括号初始化 std::initializer_list
的一个新实例,这对任意数量的向量来说就像魔术一样。