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 bilden

    vector <vector <Auto>> Fuhrpark;
    

    die inneren Vektoren sollen dabei die Typen repräsentieren:
    Vektor < Vektor Gebrauchtwagen ; Vektor Neuwagen ... > Fuhrpark

    Ziel 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 ausgebessert

    Th69 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 statt Fuhrpark[0] einfach X .
    Was ist jetzt X ?
    X ist ein vector<Auto> . (Bzw. genaugenommen ne Referenz darauf, aber darum geht's jetzt mal nicht.)
    Nur ein einfacher, X ist ja nur EIN ELEMENT von dem vector<vector<Auto>> . Genau so wie v[0] bei nem vector<int> v ein int und kein vector<int> ist. Klar soweit?

    Und X.push_back(something) fügt EIN weiteres Element an X an.
    something musst also der Element-Typ von X sein. Und der Element-Typ von vector<Auto> ist eben Auto .

    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
    

Anmelden zum Antworten