PDA

Visualizza la versione completa : [C++] Inizializzare vector di vector dentro una struct.


andrew100x100
20-12-2011, 17:20
Ciao a tutti,

sono uno studente di informatica del primo anno alla fine del corso di c++.

Un progetto d'esame richiede di creare una versione primitiva e semplice di un hard disk. In particolare viene richiesto di creare un vettore di blocchi da 512 char l'uno, ovvero un vector di vector di char. La consegna richiede che i char dentro ogni blocco siano 512 e i blocchi siano un valore a scelta. Tutto questo volevo crearlo dentro una struct.

Nonostante siano giorni che cerco la soluzione inbattendomi in "costruttori" ed altro no nriesco a fare una cosa che credo sia molto semplice:
- inizializzare ad un valore di default una variabile dentro una struct.

In pseudocodice quello che voglio realizzare è:


struct storage {
vector <vector <char> (512)> block (4096);
};


In particolare poi volevo settare dentro un #define i valori 512 e 4096 per essere modificati quando si vuole.

Solo che mi da sia messaggi di errore relativi alla sintassi del vector sia per il fatto che non posso assegnare ad un valore di default una variabile dentro una struct. Non riesco nemmeno a fare questo:


#define BLOCKSIZE 512

struct storage {
vector <char> block (BLOCKSIZE);
};


Naturalmente ho provato a cercare in internet come funzionano i costruttori mi danno comunque errore probabilmente perchè non uso una sintassi corretta.

Grazie per ogni vostro aiuto!

shodan
20-12-2011, 18:35
Al momento attuale non è possibile fare una cosa del genere. Quando i compilatori supporteranno la initialization list, forse.

Per adesso ci si deve accontentare di:


struct storage {
storage() : block(BLOCKSIZE) {}
vector <char> block;
};


In caso di vector di vector però, puoi solo inizializzare il vector più esterno. Per quello interno devi prevedere un ciclo di ridimensionamento:


struct storage {
storage() : block(BLOCKSIZE) {
for (i=0; i < BLOCKSIZE; i++) {
block[i].resize( dimensione );
}
}
vector < vector <char> > block;
};

MItaly
20-12-2011, 19:37
Originariamente inviato da shodan
In caso di vector di vector però, puoi solo inizializzare il vector più esterno.
Non basta fare semplicemente:


struct storage {
storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE)) {}
vector < vector <char> > block;
};

:bhò:

Per inciso, io piuttosto che una #define userei un parametro template di tipo size_t, o addirittura li renderei semplici parametri del costruttore, tanto comunque viene usata l'allocazione dinamica.

shodan
20-12-2011, 22:26
Originariamente inviato da MItaly
Non basta fare semplicemente:

Il vector di vector lo avrò usato si e no un paio di volte, quindi non ho mai approfondito la cosa. Ma se funziona tanto meglio: un'altra cosa imparata. :D

MItaly
20-12-2011, 23:27
Originariamente inviato da shodan
Il vector di vector lo avrò usato si e no un paio di volte, quindi non ho mai approfondito la cosa.
In effetti per i vector multidimensionali ci sono alternative migliori (ad esempio in boost).

Ma se funziona tanto meglio: un'altra cosa imparata. :D
Dovrebbe... il costruttore di vector che uso lì accetta come primo argomento il numero di elementi da mettere, e come secondo l'oggetto-modello che verrà copiato su ogni elemento creato.

andrew100x100
21-12-2011, 10:18
Grazie mille ora funziona tutto! Non ho capito però bene come funziona il costruttore block() io ho utilizzato:

struct storage {
storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE)) {} //questa riga non ho molto compreso (però funziona)
vector < vector <char> > block;
};

In pratica al primo valore da il size massimo e al secondo il contenuto di default di ogni cella del vettore?

shodan
21-12-2011, 13:31
Originariamente inviato da andrew100x100
In pratica al primo valore da il size massimo e al secondo il contenuto di default di ogni cella del vettore?
Esatto. E' uno dei costruttori di std::vector. Se poi anche al secondo dai un parametro, il vector inizializzerà ogni elemento a quel valore.



struct storage {
storage() : block(BLOCKCOUNT, vector<char>(BLOCKSIZE,0)) {} // inizializza il tutto a 0.
vector < vector <char> > block;
};

Se non capisci il perchè di:


storage() : block( etc...)

guarda qui:
http://www.cprogramming.com/tutorial/initialization-lists-c++.html

Loading