En este momento, esto debería ser
Realmente rápido ya que el bucle no se ejecutará.
En lo personal, yo probablemente usar algo como esto:
struct gen_rand {
double range;
public:
gen_rand(double r=1.0) : range(r) {}
double operator()() {
return (rand()/(double)RAND_MAX) * range;
}
};
std::vector<double> x(num_items);
std::generate_n(x.begin(), num_items, gen_rand());
Editar: Es puramente un micro-optimización que puede hacer ninguna diferencia en absoluto, pero se podría considerar la reordenación de la computación para obtener algo así como :
struct gen_rand {
double factor;
public:
gen_rand(double r=1.0) : factor(range/RAND_MAX) {}
double operator()() {
return rand() * factor;
}
};
Por supuesto, hay una muy buena posibilidad de que el compilador ya se va a hacer esto (o algo equivalente) pero no se pierde nada con intentarlo de todos modos (aunque en realidad es probablemente sólo ayuda a la optimización apagado) .
Edit2: "OSE" (como suele ser el caso) que es correcto: es posible ganar un poco reservando inicialmente el espacio, a continuación, utilizando un iterador de inserción para colocar los datos en su lugar:
std::vector<double> x;
x.reserve(num_items);
std::generate_n(std::back_inserter(x), num_items, gen_rand());
Al igual que antes , estamos en esa optimización microscópica, no estoy del todo seguro de que realmente esperar para ver una diferencia en absoluto. En particular, dado que todo esto se hace con plantillas, hay una gran posibilidad (si no es que todas) de que el código se genere en línea. En ese caso, es probable que el optimizador advierta que todos los datos iniciales se sobreescriben y omita inicializarlos.
Al final, sin embargo, casi la única parte que es muy probable para hacer una diferencia significativa es deshacerse de la .at(i)
.Los otros podrían, pero con las optimizaciones activadas, realmente no esperaría que lo hicieran.
El tipo correcto para acceder al elemento de datos de un vector por índice es 'std :: vector <...> :: size_type', no' int'. – sbi
Supongo que los compiladores comunes moverán el 'range/RAND_MAX' del propio loop en sus optimizadores? – sbi
Es curioso saber si un generador de perfiles ha identificado esto como un problema. – Puppy