квадратный корень и квадрат вектора удваивается в C ++ - PullRequest
0 голосов
/ 20 июля 2010

Я бы хотел вычислить квадрат и корень квадратный из вектора двойников. Например, дано:

 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 ]

7 голосов
/ 20 июля 2010

Тот же ответ, что и ваш предыдущий вопрос ...

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), чтобы избежать приведения.)

2 голосов
/ 20 июля 2010

Если ваш компилятор поддерживает 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);
2 голосов
/ 20 июля 2010

Я думаю второй 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>() );
...