2013-08-10 12 views
8

Scusami, sono nuovo in STL in C++. Come posso inizializzare un array di 10 puntatori vettoriali ciascuno dei quali punta a un vettore di 5 elementi int.Come inizializzare una matrice di vettore <int> in C++ con conteggi predefiniti?

codice mio frammento è il seguente:

vector<int>* neighbors = new vector<int>(5)[10]; // Error 

Grazie

+4

Non utilizzare 'new'. Un 'std :: array , 10>' suona più come quello che chiedi se non stai cambiando le dimensioni e se i miei sospetti sulla reale necessità di puntatori sono corretti. – chris

+0

L'equivalente in C++ sarebbe un 'vector >'. Qualche ragione per non usarlo? – juanchopanza

+0

Per favore fammi sapere maggiori dettagli? O un codice di esempio? – remo

risposta

17

Questo crea un vettore contenente 10 vector<int>, ognuno di quelli con 5 elementi:

std::vector<std::vector<int>> v(10, std::vector<int>(5)); 

Nota che se il la dimensione del contenitore esterno è fissa, è possibile che voglia utilizzare un std::array. Nota che l'inizializzazione è più dettagliata:

std::array<std::vector<int>, 10> v{{std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5), 
            std::vector<int>(5) 
            }}; 

Inoltre, il contenuto dell'array fa parte dell'array. La sua dimensione, come fornita da sizeof, è maggiore della versione vector e non è disponibile alcuna operazione di spostamento o scambio O (1). Un std::array è simile a un array di archiviazione semplice a dimensioni fisse.

Si noti inoltre che, come suggerisce @chris nei commenti, è possibile scegliere di impostare gli elementi dell'array dopo l'inizializzazione predefinita, ad esempio, ad es. con std::fill se sono tutti di avere lo stesso valore:

std::array<std::vector<int>, 10> v; // default construction 
std::fill(v.begin(), v.end(), std::vector<int>(5)); 

in caso contrario, è possibile impostare/modificare i singoli elementi:

v[0] = std::vector<int>(5); // replace default constructed vector with size 5 one 
v[1].resize(42); // resize default constructed vector to 42 

e così via.

+0

La prima dimensione sembra essere std :: array (ha un numero costante di elementi). Ma, se è abbastanza efficiente per passare a più funzioni. (si noti che i numeri 5 e 10 sono solo per semplicità e in effetti possono crescere fino a 1e6!) – remo

+3

Onestamente, preferirei un 'std :: fill' a quell'inizializzazione. – chris

+0

@chris Concordato.Ho aggiunto qualcosa al riguardo. – juanchopanza

Problemi correlati