webentwicklung-frage-antwort-db.com.de

vektor der Vektoren Push_back

Ich entwerfe einen Simulator für mehrstufige Warteschlangenprozesse in C++, aber ich habe ein Problem, wenn ich versuche, mehrere Warteschlangen zu implementieren (meine Warteschlangen sind Vektoren) .So, In jedem dieser Elemente befindet sich ein Vektor (Typ t_PCB). 

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

Meine Frage ist: Wie kann ich ein Element am Ende eines dieser 4 t_PCB-Vektoren einfügen? Danke im Voraus.

Ich habe die Codezeile unten ausprobiert, aber sie funktioniert nicht (Fehler: keine übereinstimmende Memberfunktion für den Aufruf 'Push_back').

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

Die Zeile von oben kann nicht verwendet werden, wenn von "Mehrebenen" gesprochen wird, da dieses Array nur Argumenttypen akzeptiert: vector <t_PCB> 

Also, wie ich am Anfang frage: Wie kann ich einen Objekttyp "t_PCB" in "Mehrebenenebene" verschieben?

20
karl71

Auf diese Weise:

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

Sie deklarieren einArray von vier vectors mit Nullgröße, die jeweils Objekte des Typs vector<t_PCB> enthalten können. Was Sie wahrscheinlich wollten, ist eher:

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

Dadurch wird ein Vektor von vier standardmäßig initialisierten Objekten vom Typ vector<t_PCB> instanziiert. Dann können Sie einfach folgendes tun:

multilevel[size].Push_back(p);

Beachten Sie jedoch, dass Vektorindizes (wie Arrayindizes) nullbasiert sind. Daher muss size kleiner als die Größe des Vektors sein. 

Im obigen Ausdruck gibt der Unterausdruck multilevel[size] eine Referenz auf den size- ten Vektor in multilevel zurück, und Sie rufen dann die Memberfunktion Push_back(p) auf, die das Element p an ihn anhängt.

22
Andy Prowl

Das Deklarieren eines zweidimensionalen Vektors ähnelt dem Deklarieren eines Arrays. Sie können es auch auf dieselbe Weise verwenden ... 

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;
18
p.j

Sie erstellen ein Array von vector<vector<t_PCB>> anstelle eines einzelnen Objekts.

Ich denke, der richtige Weg zu tun, was Sie wollen, ist:

vector<vector<t_PCB>> multilevel(4);
multilevel[0].Push_back(p)
4
Hugo Corrá

Sie können einen Vektor anstelle eines Arrays erstellen:

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

und dann können Sie Push_back am Ende des mit WHICH indizierten Vektors folgendermaßen:

multilevel[WHICH].Push_back(p)
2
4pie0

Und nur um es dort hinzustellen, um auf den Vektor der Vektoren zuzugreifen:

multilevel[outer][inner]

dabei gibt outer den Vektor an diesem Index zurück und weitere Indexierung mit inner gibt das t_PCB-Objekt zurück. Sie können auch die Array-artige Indizierung durch die Funktion .at () für Begrenzungsprüfungen ersetzen.

0
gitfredy