0

double のベクトルの平方根と平方根を計算したいと思います。たとえば、次のようになります。

 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

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 に答える