Pregunta

Me gustaría calcular el cuadrado y la raíz cuadrada de un vector de dobles.Por ejemplo dado:

 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]; 

¿Hay alguna manera de hacer lo anterior usando una función STL como transformar?¿Quizás hay una función SQRT incorporada que actúa en matrices?

¿Fue útil?

Solución

La misma respuesta que tu pregunta anterior...

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);

(El (double(*)(double)) lanzar es forzar el sqrt función para utilizar el double variante: es una función sobrecargada.Podrías usar std::ptr_fun<double, double>(sqrt) para evitar el yeso.)

Otros consejos

i Piensa El segundo transform puede simplificarse, simplemente no estoy seguro de cómo.

#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>() );

Si su compilador tiene soporte C ++ 0X, La respuesta de KennyTM puede ser ajustada un poco:

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

O si está usando BOOST, puede usar Boost :: Lambda:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top