Wie bilde ich verschachtelten Vektor richtig
-
In einem Beitrag zum Thema sortieren in den vergangenen Tagen wurden verschachtelte Vektoren empfohlen. Ich versuche mich nun an diesem Thema.
Ich will einen Vektor aus Vektoren bauen:
Die Klasse Autos besteht aus verschiedenen Objekten - Die Autos verfügen über die Eigenschaft Typ ( Neuwage = 0 ; Gebrauchtwagen = 1; Leasing = 2).
Ich will einen Vektor wie folgt bildenvector <vector <Auto>> Fuhrpark;
die inneren Vektoren sollen dabei die Typen repräsentieren:
Vektor < Vektor Gebrauchtwagen ; Vektor Neuwagen ... > FuhrparkZiel ist es die inneren Vektoren dann beliegig zu bearbeiten (zb sortieren)und vor allem automatisch zu befüllen. Ich könnte alles in einem großen Vektor verarbeiten aber das will ich hier aus Übungsgründen nicht! Ich will explizit mit inneren Vektoren arbeiten und habe das Problem, dass ich die inneren Vektoren nur per Initialisierungsliste (ich hoffe in dem Fall der richtige Ausdruck) befüllen kann. Ein manuelles Ansprechen a la Fuhrpark[0].pushback ist leider nicht möglich
class Auto { int Typ; // 0 = Neuwagen ; 1 = Gebrauchtwagen ; 2 = Leasingwagen int preis; } main { Auto A; // Neuwagen Auto B; // Gebrauchtwagen Auto C; // Neuwagen Auto D; // Leasingwagen vector <vector <Auto>> Fuhrpark; Fuhrpark.push_back(vector <Auto> {A,C}); // bedeutet glaube ich Fuhrpark[0]. = Neuwagen Fuhrpark.push_back(vector <Auto> {B}); // Fuhrpark[1]. = Gebrauchtwagenwagen cout << Fuhrpark[0].size() // ergibt 2 - logisch cout << Fuhrpark[1].size() // ergibt 1 - logisch // das ganze Compiliert auch und ich kann abfragen starten }
Ich erzeuge die Objekte aber automatisch! Für mich bedeutet, dass die Objekte ja keinen Namen haben den ich im Programmcode ansprechen kann, oder doch? Eine "Initialisierungsliste a la {vector <Auto> {A,C}} ist da ja nicht möglich" wie pack ich die denn die Objekte in die Vektoren. Das ich ne Schleife beim Auslesen machen muss ist mir klar. Und alle ausgelesenen Objekte in einen eindimensionalen Vektor kriege ich auch. Aber das ansprechen des jeweiligen inneren Vektors klappt nicht.
Ich hatte auf folgendes gehofft (vereinfacht):
int anzahlAutos = 4; // wird eigentlich mit der kopfzeile der datei eingelesen for (int i = 1; i<= anzahlAutos ; i++) { // Einlesen der Daten über Stream (Eigenschaft) << typ << preis // Zeilenende Auto neuesAuto (typ, preis) // Autokonstruktor mit Übergabe for (int ii = 0; 0 <=neuesAuto.Typ; ii++) { Jobs[ii].push_back(vector <Auto> {neuesAuto}); // so wollte ich eigentlich den inneren Vektor befüllen // das klappt aber nicht - auch nicht beim manuellen befüllen a la Jobs[0].push_back(vector <Auto> {B}) } }
Was mach ich falsch ?
-
Beitrag wurde edidiert - für Hinweise bin ich dankbar und entschuldigung dafür, dass der Beitrag vorschnell rausgeschickt wurde und ich editieren musste
-
"Ist nicht möglich" ist keine Fehlerbeschreibung!
vector <vector <Auto>> Fuhrpark(3);
macht einen Vector mit 3 inneren leeren Vectoren.
-
Meinst du statt "Jobs" eher "Fuhrpark" in deinem Code oder sind das wirklich zwei verschiedene Variablen?
Und bei deinen geschachtelten Schleifen verwendest du auch zweimal die gleiche Variable "i"?Aber Jobs[i] (bzw. Fuhrpark[i]) ist ein std::vector<Auto>, d.h. du kannst dort nur ein Auto hinzufügen (per push_back), nicht mehrere Autos (also kein std::vector<Auto>).
-
@ Manni:
also wenn ich den Code:
Jobs[2].push_back(vector <Auto> {B})
versuche zu kompilieren, kommt die Fehlermeldung:no matching function for call to 'std::vector<Auto>::push_back(std::vector<Auto>)' / kann mir denken was das heißt verstehe aber nicht warum ? Liegt wahrscheinlich daran, dass ich nichts in einen Vektor nachträglich einfügen kann. hatte gehofft, dass durch die zweidimensionalität umgehen zu können, schließlich vergrößere ich ja nur den einen Vektor auf einer ebene
@TH69:
danke für den Hinweis mit dem Code (Job)- Fehler ist ausgebessertTh69 schrieb:
Aber Jobs[i] (bzw. Fuhrpark[i]) ist ein std::vector<Auto>, d.h. du kannst dort nur ein Auto hinzufügen (per push_back), nicht mehrere Autos (also kein std::vector<Auto>).
naja bei der Bildung des Vektors hatte es ja auch geklappt
cout << Fuhrpark[0].size()
zeigt ja, dass der Vektor zwei Objekte groß ist - und hier wollte ich was dran hängen, das hätte ja keinen Einfluss auf den bisherigen Vektor Fuhrpark[0] gehabt (nur auf den Gesamtvektor) und würde ja klappen, wenn dieser alleine stehen würde. (tut er aber nicht!)
----
also wenn ich das jetzt richtig verstehe kann ich den Container Vektor nicht wie gewünscht verwenden, sondern müsste auf Multimap zurück greifen?
-
@Thomas1999
Denk dir stattFuhrpark[0]
einfachX
.
Was ist jetztX
?
X
ist einvector<Auto>
. (Bzw. genaugenommen ne Referenz darauf, aber darum geht's jetzt mal nicht.)
Nur ein einfacher,X
ist ja nur EIN ELEMENT von demvector<vector<Auto>>
. Genau so wiev[0]
bei nemvector<int> v
einint
und keinvector<int>
ist. Klar soweit?Und
X.push_back(something)
fügt EIN weiteres Element anX
an.
something
musst also der Element-Typ vonX
sein. Und der Element-Typ vonvector<Auto>
ist ebenAuto
.Oder würdest du etwa auch versuchen
vector<Auto> X; X.push_back(vector<Auto>{B}); vector<int> Y; Y.push_back(vector<int>{5});
zu schreiben, und dich dann wundern dass es nicht geht? Vermutlich (hoffentlich) nicht.
=>
Fuhrpark[0].push_back(B); // Hängt ein weiteres Auto B an den ersten vector im Fuhrpark an // Damit modifizierst du also einen bereits im Fuhrpark enthaltenen vector<Auto> // oder Fuhrpark.push_back(vector<Auto>{B}); // Fügt einen weiteres vector, welcher mit {B} initialisiert wird, an den Fuhrpark an // Sämtliche bereits im Fuhrpark enthaltenen vector<Auto> bleiben davon völlig unberührt