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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top