2008-10-06 12 views
5

Como argumento de la función consigo un vector<double>& vec (un vector de salida, por lo tanto, no const) con la longitud y los valores desconocidos. Quiero inicializar este vector a una longitud específica n con todos los ceros.(re) inicializar un vector para una cierta longitud con valores iniciales

Esto funcionará

vec.clear(); 
vec.resize(n, 0.0); 

Y esto va a funcionar así:

vec.resize(n); 
vec.assign(n, 0.0); 

Es la segunda más eficiente (porque no hay cancelación de asignación de memoria/asignación está involucrado)? ¿Hay una manera más eficiente de hacer esto?

Respuesta

9
std::vector<double>(n).swap(vec); 

Después de esto, vec está garantizado para tener el tamaño y la capacidad de n, con todos los valores 0.0.

Tal vez 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, si llamar a shrink_to_fit es un compromiso entre la celebración en más memoria que se requiere vs realizar una re-asignación.

+0

Gracias por su corrección --- He actualizado mi entrada también. :-) –

9
std::vector<double>(n).swap(vec); 

Esto tiene la ventaja de realmente compactar su vector también. (En el primer ejemplo, clear() no garantiza para compactar su vector.)

+0

Usted podría tuvieron que cambiar el tamaño() no se contrae la capacidad vectorial tampoco. –

+0

Es cierto, lo siento, lo di por hecho (ya que veo clear() como un caso especial de resize()). :-) –

+0

Este no es estándar C++ - intercambio toma una referencia no const que no se unirá al vector temporal. Visual C++ permite esto como una extensión de idioma. –

3

Bueno vamos a redondear las maneras 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)); 
+0

Los dos últimos no tienen el efecto deseado, por lo menos en la implementación predeterminada de std :: swap. :-) –

+1

En realidad lo hace :) std :: swap está sobrecargado en vector y llama a la función miembro. Esto es requerido por el estándar. –

2

Ninguno de los fragmentos de código que se haya publicado hacer cualquier cancelación de asignación de memoria, por lo que son más o menos iguales.

El truco de intercambio que todo el mundo sigue mostrando tomará más tiempo para ejecutar, porque va a desasignar la memoria utilizada originalmente por el vector. Esto puede o no ser deseable.

Cuestiones relacionadas