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

Come vengono inizializzati gli elementi di questi 3 vettori?std :: elementi vettoriali di inizializzazione

Informazioni su int, lo test e ho visto che tutti gli elementi diventano 0. È questo standard? Credevo che i primitivi restassero indefiniti. Creo un vettore con 300000000 elementi, fornisco valori diversi da zero, lo elimino e lo ricrei, per evitare la memoria del sistema operativo in modo chiaro per la sicurezza dei dati. Anche gli elementi del vettore ricreato erano 0.

E l'iteratore? Esiste un valore iniziale (0) per il costruttore predefinito o il valore iniziale rimane indefinito? Quando lo controllo, gli iteratori puntano a 0, ma può essere OS

Quando creo un oggetto speciale per tracciare i costruttori, ho visto che per il primo oggetto, il vettore esegue il costruttore predefinito e per tutti gli altri esegue il costruttore di copie . È questo standard?

C'è un modo per evitare completamente l'inizializzazione degli elementi? O devo creare il mio vettore? (Oh mio Dio, dico sempre NON UN'ALTRA IMPLEMENTAZIONE VETTORIALE) Chiedo perché uso matrici sparse ultra enormi con elaborazione parallela, quindi non posso usare push_back() e ovviamente non voglio un'inizializzazione inutile, quando più tardi cambierò il valore.

risposta

13

Si utilizza questo costruttore (per std::vector<>):

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

che ha la seguente documentation:

ripetitivo costruttore di sequenza: Inizializza il vettore con il suo contenuto impostato su una ripetizione, n volte, di copie di value.

Dal momento che non si specifica il value prende il default-valore del parametro, T(), che è int nel tuo caso, in modo che tutti gli elementi saranno essere 0

+2

Credo che _C++ 11_ cambi questo a 'n valori inizializzati di default 'invece di un'inizializzazione predefinita seguita da un numero di copie. –

+0

@Attila Vedi la mia risposta per le citazioni da C++ 11. – pmr

+0

Sì C++ 11 lo cambia in n costruttori predefiniti. Confermato. – Chameleon

3

Gli elementi di un vettore sono inizializzati di default, che nel caso di tipi POD significa zero inizializzati. Non c'è modo di evitarlo con un vettore standard.

+1

Iniziali non inizializzati, sono inizializzati in base al valore. – ildjarn

+0

@ildjarn, sapevo che stavo per rovinare tutto. Non riesco mai a mantenere dritti quegli stili di inizializzazione. –

+0

Stessa cazzata da parte mia. La semantica di C++ mi sfugge di volta in volta, e uso il linguaggio ogni giorno ... –

5

Inizialmente vengono inizializzati.

Informazioni su int, lo test e ho visto che tutti gli elementi diventano 0. È questo standard? Credevo che i primitivi restassero indefiniti.

No, un non inizializzatoint ha un valore indeterminato . Questi sono di default inizializzato, cioè,

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

In C++ 11 del le specifiche per il costruttore vector::vector(size_type n) indicano che gli elementi n sono inseriti di default. Questo viene definito come un elemento inizializzato dall'espressione allocator_traits<Allocator>::construct(m, p) (dove m è del tipo allocatore e p un puntatore al tipo archiviato nel contenitore). Per l'allocatore predefinito questa espressione è ::new (static_cast<void*>(p)) T() (vedere 20.6.8.2). Questo valore inizializza ogni elemento.

Problemi correlati