欧氏距离的std :: transform矢量

nie*_*tiw 0 c++ stl vector c++11

我想找到计算向量中某些点的欧氏距离的最佳方法.我试图使用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;
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

vso*_*tco 5

首先,您需要transformaccumulate转化载体

std::transform(v.begin(), v.end(), v.begin(), square);                                                                                                       
cout << std::sqrt(std::accumulate(v.begin(), v.end(), 0)) << endl;
Run Code Online (Sandbox Code Playgroud)

因为std::transform没有(还)返回一个范围.如果/当Eric Niebler范围将进入C++ 17时,您将能够更加简洁和优雅地编写此代码.

Live on Coliru

在效率方面,我认为它非常有效.除非您(从分析器)知道您遇到了代码的"热门"区域,否则不要担心微优化.

  • @nietsnegttiw第四个参数用于定义累积函数; 默认情况下使用`+`,但您可以使用其他操作. (2认同)

bam*_*s53 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';    
}
Run Code Online (Sandbox Code Playgroud)