Domanda

Mi piacerebbe calcolare il quadrato e la radice quadrata di un vettore di doppi.Ad esempio dato:

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

C'è un modo per fare quanto sopra usando una funzione STL come la trasformazione?Forse C'è una funzione SQRT integrata che agisce su array?

È stato utile?

Soluzione

Stessa risposta come La tua domanda precedente ...

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

(il cast (double(*)(double)) è quello di forzare la funzione sqrt per utilizzare la variante double - è una funzione sovraccaricata. È possibile utilizzare std::ptr_fun<double, double>(sqrt) per evitare il cast.)

Altri suggerimenti

i pensa il secondo transform può essere semplificato, non sono sicuro di come.

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

Se il tuo compilatore ha il supporto C ++ 0x, Risposta del Kennytm può essere modificata un po ':

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

o se stai usando Boost, puoi usare Boost :: Lambda:

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top