vectores matrices lenguaje initialize imprimir elementos crear arreglos array c++ stl initialization

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.