2012-06-05 27 views
8
std::vector<int> v1(1000); 
std::vector<std::vector<int>> v2(1000); 
std::vector<std::vector<int>::const_iterator> v3(1000); 

¿Cómo se inicializaron los elementos de estos 3 vectores?std :: elementos de vector inicializando

Acerca de int, lo pruebo y vi que todos los elementos se convierten en 0. ¿Es este estándar? Creí que los primitivos permanecen indefinidos. Creo un vector con 300000000 elementos, proporciono valores distintos de cero, lo elimino y lo vuelvo a crear, para evitar la memoria del sistema operativo para la seguridad de los datos. Los elementos del vector recreado también eran 0.

¿Qué pasa con el iterador? ¿Hay un valor inicial (0) para el constructor predeterminado o el valor inicial permanece indefinido? Cuando compruebo esto, los iteradores apuntan a 0, pero esto puede ser OS

Cuando creo un objeto especial para rastrear constructores, vi que para el primer objeto, vector ejecuta el constructor predeterminado y para todos los demás ejecuta el constructor de copia . ¿Es este estándar?

¿Hay alguna manera de evitar completamente la inicialización de elementos? ¿O debo crear mi propio vector? (Oh, Dios mío, siempre digo NO OTRA IMPLANTACIÓN DE VECTOR) Lo pregunto porque uso matrices dispersas ultragrandes con procesamiento paralelo, así que no puedo usar push_back() y por supuesto no quiero una inicialización inútil, cuando más tarde cambie el valor.

Respuesta

13

Está utilizando este constructor (por std::vector<>):

explicit vector (size_type n, const T& value= T(), const Allocator& = Allocator()); 

que tiene la siguiente documentation:

repetitivo constructor de secuencia: Inicializa el vector con su contenido configurado a una repetición, n veces, de copias de value.

Dado que no se especifica el value que toma el valor por defecto el valor del parámetro, T(), que es int en su caso, por lo que todos los elementos se ser 0

+2

Creo que _C++ 11_ cambia esto a 'n valores inicializados por defecto' en lugar de una inicialización predeterminada seguida de un número de copias. –

+0

@Attila Véase mi respuesta para las cotizaciones de C++ 11. – pmr

+0

Sí C++ 11 cámbialo a n constructores predeterminados. Confirmado. – Chameleon

3

Los elementos de un vector se inicializan por defecto, lo que en el caso de los tipos de POD significa cero inicializado. No hay forma de evitarlo con un vector estándar.

+1

No están inicializados por defecto, tienen valor inicializado. – ildjarn

+0

@ildjarn, yo sabía que iba a atornillar eso. Nunca puedo mantener esos estilos de inicialización en línea recta. –

+0

Lo mismo arruinó mi parte. La semántica de C++ todavía me escapa de vez en cuando, y uso el lenguaje todos los días ... –

5

Se inicializan por defecto.

Acerca de int, lo pruebo y vi que todos los elementos se vuelven 0. ¿Es esta la norma? Creí que los primitivos permanecen indefinidos.

No, un sin inicializarint tiene un valor indeterminado . Estos son por defecto inicializado, es decir,

int i;   // uninitialized, indeterminate value 
int k = int(); // default initialized, value == 0 
5

En C++ 11 del la especificación para el constructor vector::vector(size_type n) dice que los elementos n están insertados por defecto. Esto se define como un elemento inicializado por la expresión allocator_traits<Allocator>::construct(m, p) (donde m es del tipo de asignador y p un puntero al tipo almacenado en el contenedor). Para el asignador predeterminado, esta expresión es ::new (static_cast<void*>(p)) T() (ver 20.6.8.2). Este valor inicializa cada elemento.

Cuestiones relacionadas