c++ - sirve - vector de vectores push_back
vector c++ (6)
Estoy diseñando un simulador de proceso de cola de varios niveles en C ++, pero tengo un problema al intentar implementar varias colas (mis colas son vectores). Por lo tanto, "multinivel" es una matriz de 4 elementos (no vector). Dentro de cada uno de esos elementos hay un vector (tipo t_PCB).
vector<vector<t_PCB>> multilevel[4];
Mi pregunta es: ¿Cómo puedo insertar un elemento al final de uno de estos 4 vectores t_PCB
? Gracias de antemano.
He intentado la línea de código a continuación pero no funciona ( error : la función de miembro no coincide para la llamada ''push_back'')
multilevel[0].push_back(p); //where "p" is a t_PCB object
La línea de arriba no se puede usar cuando se habla de "multinivel" porque esta matriz solo acepta argumentos de tipo: vector <t_PCB>
Entonces, como pregunto al principio: ¿cómo puedo empujar un tipo de objeto "t_PCB" dentro de "multinivel"?
Al hacer esto:
vector<vector<t_PCB> > multilevel[4];
Declara una matriz de cuatro vectors
tamaño cero, cada uno de los cuales puede contener objetos de tipo vector<t_PCB>
. Lo que probablemente quisiste hacer es más bien:
vector<vector<t_PCB> > multilevel(4);
// ^^^
Esto creará una instancia de un vector de cuatro objetos inicializados por defecto del tipo vector<t_PCB>
. Entonces, simplemente puedes hacer:
multilevel[size].push_back(p);
Sin embargo, tenga en cuenta que los índices vectoriales (como los índices de matriz) están basados en cero, por lo que el size
debe ser menor que el tamaño del vector.
En la expresión anterior, la subexpresión multilevel[size]
devuelve una referencia al size
-th vector dentro de multilevel
, y en ese vector está invocando la función miembro push_back(p)
, que le agrega el elemento p
.
Declarar un vector bidimensional es similar a declarar una matriz. También puedes usarlo de la misma manera ...
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;
Está creando una matriz de vector<vector<t_PCB>>
lugar de un solo objeto.
Creo que la forma correcta de hacer lo que quieres es:
vector<vector<t_PCB>> multilevel(4);
multilevel[0].push_back(p)
Puedes crear un vector en lugar de una matriz:
std::vector< std::vector<t_PCB>> multilevel(4); // 2 dim array, 1st dim is 4
y luego puede push_back al final del vector indexado con WHICH
esta manera:
multilevel[WHICH].push_back(p)
Y solo para ponerlo ahí, para acceder al vector de vectores:
multilevel[outer][inner]
donde outer
devolverá el vector en ese índice y la indexación adicional con inner
devolverá el objeto t_PCB
. También puede reemplazar la indexación de estilo de matriz con la función .at() para verificaciones de límites.
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