我想找到计算向量中某些点的欧几里德距离的最佳方法。我试图使用std :: transform来对每个数字进行平方,然后将此函数作为参数传递给std :: accumulate。这是最有效的方式吗?截至目前我的实现有一个错误,错误是:
in instantiation of function template specialization 'std::__1::accumulate<std::__1::__wrap_iter<int *>, int, std::__1::__wrap_iter<int *> >' requested
here
cout << std::sqrt(std::accumulate(v.begin(), v.end(), 0, std::transform(v.begin(), v.end(), v.begin(), square))) << endl;
这是我的代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<cmath>
using std::cout;
using std::endl;
using std::string;
int square(int n) {return n*n;}
int
main()
{
std::vector<int> v;
std::vector<int> v1;
for(int i = 0; i < 10; ++i)
{v.push_back(i);}
v1.resize(v.size());
//std::transform (v.begin(), v.end(), v1.begin(), square);
//std::copy(v.begin(), v1.begin(), std::ostream_iterator<int>(cout, ", "));
//cout << std::sqrt(std::accumulate(v1.begin(), v1.end(), 0)) << endl;
cout << std::sqrt(std::accumulate(v.begin(), v.end(), 0, std::transform(v.begin(), v.end(), v.begin(), square))) << endl;
//for(auto it = v1.begin(); it != v1.end(); it++)
//{cout << *it << endl;}
return 0;
}
答案 0 :(得分:5)
您需要先transform
然后accumulate
转换后的矢量
std::transform(v.begin(), v.end(), v.begin(), square);
cout << std::sqrt(std::accumulate(v.begin(), v.end(), 0)) << endl;
因为std::transform
没有(还)返回一个范围。如果/ Eric Niebler&#39; s ranges将进入C ++ 17,您将能够更加简洁和优雅地编写此代码。
就效率而言,我说它效率很高。不要担心微观优化,除非你知道(来自一个分析器)你发现了一个热门的&#34;你的代码区域。
答案 1 :(得分:5)
这正是std::inner_product
的用途。
#include<iostream> // cout
#include<vector> // vector
#include<numeric> // inner_product, iota
#include<cmath> // sqrt
using std::cout;
int
main()
{
std::vector<int> v(10);
std::iota(begin(v), end(v), 0);
double result = std::sqrt(std::inner_product(begin(v), end(v), begin(v), 0));
cout << result << '\n';
}