gpt4 book ai didi

c++ - std::transform Vector For Euclidean 距离

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:53 25 4
gpt4 key购买 nike

我想找到计算 vector 中某些点的欧氏距离的最佳方法。我正在尝试使用 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;
}

最佳答案

您需要先转换,然后累积转换后的 vector

std::transform(v.begin(), v.end(), v.begin(), square);                                                                                                       
cout << std::sqrt(std::accumulate(v.begin(), v.end(), 0)) << endl;

作为std::transform不(还)返回一个范围。如果/当Eric Nieblerranges将达到 C++17,您将能够更简洁优雅地编写此代码。

Live on Coliru

在效率方面,我会说它非常高效。不要担心微优化,除非您知道(从分析器中)您击中了代码的“热”区域。

关于c++ - std::transform Vector For Euclidean 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35021123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com