使用this thread as help我想计算两个向量之间的距离。所以我的方法是:
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.
。但是怎么样?我的方法有两个参数,我还有两个向量?
答案 0 :(得分:0)
原因是您已将该函数指定为模板,但这两个函数参数都与模板参数无关。
如果您希望该功能仅适用于double vectors_distance(vector<double> vec1, vector<double> vec2)
{
// same body you have
}
,则该功能不需要是模板。
std::vector<T>
如果您希望该函数适用于T
(假设pow()
是可以提供给double
的类型等),请将其保留为模板,然后更改{函数内的{1}}到T
。例如;
template <typename T>
T vectors_distance(vector<T> vec1, vector<T> vec2)
{
// same function body, but replace "double" by "T" everywhere
}
其他一些评论。
首先,最好通过std::vector
引用传递const
个参数,而不是按值传递。
其次,没有必要构建一个临时向量来保存中间结果。只需使用更好的算法。例如,可以编写非模板版本
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()
的文档,了解其功能。