我为+写了一个重载来添加两个vector<double>
:
vector<double> operator+(vector<double> v, vector<double> u)
{
int n = (v.size()<u.size()) ? v.size() : u.size();
vector<double> w;
for (int j = 0; j<n; ++j)
w.push_back(v[j] + u[j]);
return w;
};
如果我输入.cpp文件就可以了。但是如果我输入.hpp文件,它会产生很多与“xutils”系统文件相关的错误。这是正常的吗?
答案 0 :(得分:2)
如果要在头文件中定义全局函数,则必须使其成为内联函数。
inline vector<double> operator+(vector<double> v, vector<double> u)
{
...
}
然而,您可以在标头中声明,然后在一个cpp文件中定义它。
//x.hpp
vector<double> operator+(vector<double> v, vector<double> u);
//x.cpp
vector<double> operator+(vector<double> v, vector<double> u)
{
int n = (v.size()<u.size()) ? v.size() : u.size();
vector<double> w;
for (int j = 0; j<n; ++j)
w.push_back(v[j] + u[j]);
return w;
} // No need for a semi colon here
答案 1 :(得分:2)
您不必定义全局operator+
来添加两个std::vector
STL有此功能。定义全局运算符可能会使事情变得混乱并导致冲突。您可以使用std::transform
:
std::vector<double> a {1.0, 2.0, 3.0, 4.0, 5.0};
std::vector<double> b {5.0, 4.0, 3.0, 2.0, 1.0};
std::vector<double> res(a.size());
std::transform(std::begin(a), std::end(a), std::begin(b), std::begin(res), std::plus<double>());
答案 2 :(得分:0)
将原型更改为
inline vector<double> operator+(const vector<double>& v, const vector<double>& u)
inline
允许将函数体写入标题。
通过常量引用传递参数对于编译是不必要的,但将防止获取值副本,因此可以在不损失程序稳定性的情况下提高性能。
(在标题范围内有这样的函数是不明智的,因为它可能污染你的代码库。而且,实现看起来不正确:你没有在你的总和中包含更大的向量中的多余元素。)