0

我想计算双打向量的平方和平方根。例如给出:

 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 函数作用于数组?

4

3 回答 3

7

与您上一个问题的答案相同...

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)来避免转换。)

于 2010-07-20T14:58:53.253 回答
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>() );
于 2010-07-20T15:09:14.180 回答
2

如果您的编译器支持 C++0x,则可以稍微调整KennyTM 的答案:

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);
于 2010-07-20T17:19:01.080 回答