Square-root e quadrato del vettore raddoppia in C ++
-
18-09-2020 - |
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?
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);
.