2013-05-30 19 views
5

Desidero creare un vettore di elementi che rappresentano una determinata struttura.Allocazione memoria Vector C++

Il fatto è che non so quanti elementi avrà la struttura, poiché il numero cambierà molto spesso e non so davvero come creare un vettore.

Come farlo?

al fine di rendere più chiaro:

ho visto che durante la creazione di un vettore, si fa qualcosa di simile:

std::vector<structureType> vectorName(nrOfElements); 

Non conosco il numero di elementi e che cosa scrivere lì, tra parentesi.

+1

L'intero punto di 'std :: vector' non è necessario conoscere la dimensione. Basta saltare le parentesi del tutto, quindi aggiungere al vettore usando ['myVector.push_back();'] (http://en.cppreference.com/w/cpp/container/vector/push_back). Espande automaticamente la sua memoria interna secondo necessità. Ottieni la dimensione corrente con ['myVector.size();'] (http://en.cppreference.com/w/cpp/container/vector/size). – BoBTFish

+1

possibile duplicato di [Assegna memoria per un vettore] (http://stackoverflow.com/questions/4427738/allocate-memory-for-a-vector) –

risposta

12

Se di default costruire il vettore, si ottiene un vuoto uno:

std::vector<structureType> vectorName; // holds 0 elements 

quindi si può spingere elementi nel vettore, aumentando la sua dimensione (vedi anche altri vector modifiers):

vectorName.push_back(someStructureTypeInstance); 

Questo potrebbe soddisfare le tue esigenze. Se sei preoccupato per le future ridistribuzioni della memoria, puoi usare std::vector::reserve dopo aver costruito il vettore.

std::vector<structureType> vectorName; // holds 0 elements 
vectorName.reserve(100); // still 0 elements, but capacity for 100 
+0

Se faccio ciò che hai suggerito, menaing riservando spazio, cosa succede se per esempio prendo spazio per 101 elementi e poi aggiungo il 102 ° elemento? Inoltre, nel mio programma, alloco memoria in modo dinamico. Se scelgo di dichiarare il vettore in questo modo: std :: vector vectorName; e quindi aggiungere solo elementi ad esso, c'è qualche possibilità che questo potrebbe sovrapporsi alla memoria allocata manualmente? – user2399378

+4

@ user2399378 ciò che accade quando si inserisce l'elemento 102nd è che il vettore deve allocare un nuovo blocco di memoria che è abbastanza grande per 102 elementi (di solito assegna circa 2 volte la dimensione richiesta), quindi copia o sposta tutti i suoi elementi da il pezzo originale di memoria di 101 dimensioni per quello nuovo, quindi deselezionare l'originale. Queste sono le ridistribuzioni di cui stavo parlando. Non devi preoccuparti della gestione della memoria, ma le riallocazioni possono essere costose, quindi se sai quanto sarà grande il vettore, puoi evitarle prenotando la giusta quantità. – juanchopanza

1

ho don''t sai cosa scrivere lì tra parentesi

Write niente)) In questo caso si creerà un vettore vuoto, wich potrebbe essere coltivata con std::vector::push_back()

Aggiornamento

: Non dimenticare di rimuovere () vuoto per evitare vexing parse

+1

[Se non si scrive nulla tra parentesi, si ottiene l'analisi più irritante] (https://ideone.com/B5sBce). Ometti le parentesi (o usa la sintassi di inizializzazione uniforme '{}' per le parentesi graffe se usi 'C++ 11'). – BoBTFish

+1

In realtà dichiarerai una funzione del genere. Quindi devi anche omettere '()', o usare '{}' se hai C++ 11. – juanchopanza

+0

@BoBTFish sì, conosco l'irritante analisi. E sì, ho dimenticato di dire di omettere '()'. Grazie per il commento. Aggiornerò – borisbn

1

È possibile modificare il numero di elementi il il vettore contiene, inserendo e/o rimuovendo gli elementi. Stai cercando specificamente i metodi del vettore insert, push_back/emplace_back, resize, pop_back, erase.

Troverai descrizioni dei metodi in qualsiasi riferimento C++ (ad esempio, dai un'occhiata a here nella sezione "Modificatori") e nel libro per principianti C++ di tua scelta.