矢量的平方根和平方在C ++中加倍

时间:2010-07-20 14:53:45

标签: c++ vector stl square-root exponent

我想计算双精度矢量的平方和平方根。例如:

 vector<double> Array1(10,2.0); 
 vector<double> Array2(10,2.0); 

 for(unsigned int i=0; i<Array1.size(); i++)
     Array1[i] = sqrt(Array1[i]);

 for(unsigned int i=0; i<Array2.size(); i++)
     Array2[i] = Array2[i] * Array2[i]; 

有没有办法使用STL等函数进行上述操作?也许 有一个内置的sqrt函数作用于数组?

3 个答案:

答案 0 :(得分:7)

your previous question相同的答案......

static inline double computeSquare (double x) { return x*x; }

...

std::transform(Array1.begin(), Array1.end(), Array1.begin(), (double(*)(double)) sqrt);
std::transform(Array2.begin(), Array2.end(), Array2.begin(), computeSquare);

(double(*)(double))强制转换是强制sqrt函数使用double变体 - 它是一个重载函数。您可以使用std::ptr_fun<double, double>(sqrt)来避免强制转换。)

答案 1 :(得分:2)

认为第二个transform可以简化,我只是不确定如何。

#include <algorithm>
using namespace std;

vector<double> Array1(10,2.0); 
vector<double> Array2(10,2.0); 

transform( Array1.begin(), Array1.end(), Array1.begin(), sqrt );
transform( Array2.begin(), Array2.end(), Array2.begin(), Array2.begin(), multiplies<double>() );

答案 2 :(得分:2)

如果你的编译器支持C ++ 0x,KennyTM's answer可以稍微调整一下:

std::transform(Array1.begin(), Array1.end(), Array1.begin(), [](double f)->double { return f * f; });

或者如果您使用的是Boost,则可以使用Boost :: lambda:

#include <boost/lambda.hpp>
using namespace boost::lambda;

std::transform(Array1.begin(), Array1.end(), Array1.begin(), _1 * _1);