c++ - matrices - (re) inicializar un vector a una cierta longitud con valores iniciales
vectores c++ (4)
Como argumento de función obtengo un vector<double>& vec
(un vector de salida, por lo tanto no const) con longitud y valores desconocidos. Quiero inicializar este vector a una longitud específica n con todos los ceros.
Esto funcionará
vec.clear();
vec.resize( n, 0.0 );
Y esto funcionará también:
vec.resize( n );
vec.assign( n, 0.0 );
¿El segundo es más eficiente (porque no hay asignación / asignación de memoria involucrada)? ¿Hay una manera más eficiente de hacer esto?
Bueno, vamos a completar las formas de hacerlo :)
vec.swap(std::vector<double>(n));
std::vector<double>(n).swap(vec);
std::swap(vector<double>(n), vec);
std::swap(vec, vector<double>(n));
Ninguno de los fragmentos de código que ha publicado hace una desasignación de memoria, por lo que son más o menos iguales.
El truco de intercambio que todos los demás publican tardará más en ejecutarse, ya que desasignará la memoria utilizada originalmente por el vector. Esto puede o no ser deseable.
std::vector<double>(n).swap(vec);
Esto tiene la ventaja de compactar tu vector también. (En su primer ejemplo, clear()
no garantiza compactar su vector.)
std::vector<double>(n).swap(vec);
Después de esto, se garantiza que vec tendrá tamaño y capacidad n, con todos los valores 0.0.
Quizás la forma más idiomática desde C ++ 11 es
vec.assign(n, 0.);
vec.shrink_to_fit();
con la segunda línea opcional. En el caso de que vec
comience con más de n
elementos, si llamar a shrink_to_fit
es una shrink_to_fit
entre mantener más memoria de la requerida vs realizar una reasignación.