(re) inicializar un vector a una cierta longitud con valores iniciales
-
05-07-2019 - |
Pregunta
Como argumento de función obtengo un vector<double>& vec
(un vector de salida, por lo tanto, no constante) 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 también funcionará:
vec.resize( n );
vec.assign( n, 0.0 );
¿Es el segundo más eficiente (porque no hay asignación / asignación de memoria involucrada)? ¿Hay una manera más eficiente de hacer esto?
Solución
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 en que vec
comienza con más de n
elementos, llamar a shrink_to_fit
es una compensación entre retener más memoria de la requerida y realizar una reasignación.
Otros consejos
std::vector<double>(n).swap(vec);
Esto tiene la ventaja de compactar realmente su vector también. (En su primer ejemplo, clear()
no garantiza compactar su vector).
Bueno, vamos a completar las formas de hacer esto :)
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 ninguna desasignación de memoria, por lo que son aproximadamente iguales.
El truco de intercambio que todos los demás siguen publicando tardará más en ejecutarse, ya que desasignará la memoria utilizada originalmente por el vector. Esto puede o no ser deseable.