使用此线程作为帮助,我想计算两个向量之间的距离。所以我的方法是:
template <typename T>
double vectors_distance(vector<double> vec1, vector<double> vec2) {
std::vector<double> aux;
std::transform(vec1.begin(), vec1.end(), vec2.begin(), std::back_inserter(aux),
[](double element1, double element2) {return pow((element1 - element2), 2);
});
aux.shrink_to_fit();
return std::sqrt(std::accumulate(aux.begin(), aux.end(), 0.0));
}
在另一种方法中,我创建了两个vector<double> numbers, numbers1
并用一些值填充它们,如下所示:
stringstream ss(coordSynth);
double num;
while (ss >> num) {
numbers.push_back(num);
cout << typeid(numbers).name() << endl;
}
编辑:
作为背景知识:coordSynth
是一个字符串,其中包含doubles
作为值(即:"0.0, 45.3, 2.0"(。对于number1
发生完全相同的情况(与number
一样(。 好的,现在我打电话给vectors_distance(numbers, numbers1);
并得到错误E0304 No instance of function template "vectors_distance" matches the argument list.
.但是怎么做呢?我的方法正好有两个参数,我也放了两个向量?
原因是您已将函数指定为模板,但两个函数参数都与模板参数无关。
如果您希望该函数仅适用于std::vector<double>
,则该函数不需要是模板。
double vectors_distance(vector<double> vec1, vector<double> vec2)
{
// same body you have
}
如果您希望函数适用于std::vector<T>
(假设T
是可以提供给pow()
等的类型(,则将其保留为模板,并在函数中将double
更改为T
。 例如;
template <typename T>
T vectors_distance(vector<T> vec1, vector<T> vec2)
{
// same function body, but replace "double" by "T" everywhere
}
其他几点评论。
首先,通常最好通过const
引用而不是值传递std::vector
参数。
其次,没有必要构建一个临时向量来保存中间结果。 只需使用更好的算法即可。 例如,可以编写非模板版本
double vectors_distance(const vector<double> &vec1, const vector<double> &vec2)
{
return std::sqrt(
std::inner_product(vec1.begin(), vec1.end(), vec2.begin(), 0.0,
std::plus<double>(),
[](double e1, double e2) {return (e1-e2)*(e1-e2);}
)
);
}
阅读std::inner_product()
文档以了解其作用。