2013-04-05 18 views
15

Sto progettando un simulatore di processo di coda multilevel in C++ ma ho un problema quando cerco di implementare diverse code (le mie code sono vettori) .So, "multilevel" è un array di 4 elementi (non vettore). All'interno di ciascuno di questi elementi c'è un vettore (tipo t_PCB).vettore di vettori push_back

vector<vector<t_PCB>> multilevel[4]; 

La mia domanda è: Come posso inserire un elemento alla fine di una di queste 4 t_PCB vettori? Grazie in anticipo.

ho provato la linea codice qui sotto, ma non funziona (errore: non corrispondenti funzione membro per 'push_back' chiamata)

multilevel[0].push_back(p); //where "p" is a t_PCB object 

La linea dall'alto non può essere utilizzato quando si parla su "multilivello" perché questo array accetta solo argomenti tipo: vector < t_PCB>

Quindi, come chiedo all'inizio: come posso inserire un tipo di oggetto "t_PCB" all'interno di "multilivello"?

+0

multilivello non è un "4 elementi vettoriale" ma una matrice di un vettore contenente vettori di t_PCB – Paranaix

risposta

16

In questo modo:

vector<vector<t_PCB> > multilevel[4]; 

si dichiara una serie di quattro dimensioni pari a zero vectors, ognuno dei quali può contenere oggetti di tipo vector<t_PCB>. Quello che probabilmente voleva fare è piuttosto:

vector<vector<t_PCB> > multilevel(4); 
//        ^^^ 

Ciò istanziare un vettore di quattro oggetti default-inizializzato di tipo vector<t_PCB>. Poi, basta si può fare:

multilevel[size].push_back(p); 

noti, però, che gli indici vettoriali (come indici di array) sono a base zero, in modo da size deve essere inferiore alla dimensione del vettore.

Nell'espressione sopra, il sotto-espressione multilevel[size] restituisce un riferimento alla size vettore -esimo all'interno multilevel, e in quel vettore si sono poi invocano la funzione membro push_back(p), che aggiunge elemento p ad esso.

+0

questo codice -> multilivello [size] .push_back (p); funziona solo se multilivello è dichiarato come segue; vector multilivello [4]; – karl71

+0

ovviamente ho un errore se uso quella riga nel mio codice – karl71

+0

@ jafm92 Guarda attentamente. È necessario cambiare '[4]' a '(4)'. Stavi dichiarando una schiera di vettori di vettori. Andy ti sta mostrando come dichiarare solo un vettore di vettori. D'altra parte, 'vector multilevel [4]' è una matrice di vettori. Devi decidere quale vuoi. –

4

Si sta creando un array di vector<vector<t_PCB>> anziché un singolo oggetto.

penso che il modo giusto di fare quello che vuoi è:

vector<vector<t_PCB>> multilevel(4); 
multilevel[0].push_back(p) 
2

È possibile creare un vettore al posto di array:

std::vector< std::vector<t_PCB>> multilevel(4); // 2 dim array, 1st dim is 4 

e quindi si può push_back alla fine del vettore indicizzato con WHICH questo modo:

multilevel[WHICH].push_back(p) 
16

Dichiarazione di una due vettore dimensionale è simile a dichiarare un array. Puoi anche usarlo nello stesso modo ...

vector<vector<int> > vec; 

    for(int i = 0; i < 5; i++) 
    { 
     vector<int> row; 
     vec.push_back(row); 
    } 

    vec[0].push_back(5); 
    cout << vec[0][0] << endl; 
0

E proprio per mettere fuori là, per accedere il vettore di vettori:

multilevel[outer][inner] 

dove outer tornerà il vettore in tale indice e in seguito indicizzazione con inner restituirà l'oggetto t_PCB. È inoltre possibile sostituire l'indicizzazione in stile array con la funzione .at() per i controlli dei limiti.

-1
vector<vector<int>> vec; // declare 2D vector 

    for (int i=0; i<=3; i++) { 
     vector<int> row; // create a row vector which adds a row to vec 
     for (int j=0; j<=4; j++) { 
      row.push_back(j*10); // push elements 0,10,20,30,40 to row 
     } 
     vec.push_back(row); // add this row to vec 
     // Repeat this procedure 4 times to make a 4*5 2D vector 
    } 

    cout<<"output is "<<vec[2][4]; // output is 40