struct in verschachtelte vectoren sortieren



  • Hallo zusammen,

    ich habe ein Problem mit verschachtelten Vektoren. Ich muss den Auseren Vektor nach einem Wert des Structs des inneren Vektors sortieren.
    Hört sich verwirrend an, deshalb hier mal ein codebeispiel:

    struct meinStruct
    {
     int a; //bei allen Vektoren des "inneren" Vekrors der gleiche Wert
     int b; //bei alles Vektoren unterschiedlich
    };
    
    vect< vect< meinstruct > > meineDaten;
    

    wenn man das nun ausgibt (ich beschränke mich mal auf pseudocode):

    for(Anfang bis Ende "auserer" Vektor)
    {
     for(Anfang bis Ende "innerer" Vektor)
     {
      cout<<meineDaten[iterator ausen][iterator innen].a<<",";
      cout<<meineDaten[iterator ausen][iterator innen].b<<" ";
     }
     cout<<endl;
    }
    

    sollte das bei 3/3 ungefägr so aussehen:
    `

    a,b a,b a,b

    a,b a,b a,b

    a,b a,b a,b

    `
    Der Wert a hat dabei nun in jeder Zeile den gleichen wert (in diesem Beispiel 1, 2 oder 3)

    Mein Problem ist nun das ich die auseren Vektoren nach dem a-wert eines (z.B. des ersten Vetors in einer Zeile, ia aberegal, da die in einer Zeile sowieso gleich sind)inneren Vektors Sortieren sollte.

    analog zum Beispiel bedeutet das:
    vorm sortieren zum Beispiel:
    `

    2,b 2,b 2,b

    1,b 1,b 1,b

    3,b 3,b 3,b

    `

    sollte sirtiertwerden das die ausgabe nacher folgendes ergibt:

    `

    1,b 1,b 1,b

    2,b 2,b 2,b

    3,b 3,b 3,b

    `

    Ich hoffe ich habe mein Problem verständlich dargelegt.
    Vielen Dank für jeden Tipp oder Ansatz oder natürlich Lösung. ich probiere seit einer weile rum, scheitere aber kläglich drann 😞



  • In etwa so:
    - Sortierbedigung anpassen
    - geht eventuell auch by-reference die Methode, weiß es aber nicht aus dem Stehgreif.

    #include <algorithm>
    
    // ...
    
    bool mySort(vector<meinStruct> a, vector<meinStruct> b){
      if (a.size() == 0) return false;
      if (b.size() == 0) return true;
      return a[0].a < b[0].a;
    }
    
    // ...
    
    vector< vector< meinStruct > > myVec;
    
    // ...
    
    std::sort(myVec.begin(), myVec.end(), mySort);
    


  • definier dir einen > < operator und du kannst auch standard sort funktionen benutzen



  • Ahh, es war das fehlende const woran er sich störte:

    bool operator<(const std::vector<struc> &a, const std::vector<struc> &b){
     //...
    }
    
    //..
    
    std::sort(vec.begin(), vec.end());
    


  • Danke, das hört sich schonmal sehr gut an, werd ich sofort mal ausprobieren!



  • Eine Nachfrage hätte ich noch:
    Die kombination aus vektoren und Zeigern macht mir noch ziemliche Probleme.

    wie kann ich denn den verschachtelten einen (mal wieder) verschachtelten Vektor an eine funktion übergeben, aber nicht so das die eine Kopie hat (by value, wenn ich mich richtig erinnere) sondern das die einen Zeiger auf den originalen Vektor hat. (müsste dann by reference sein)

    meineFunktion(?)
    {
    //bearbeite die Daten
    }
    
    void main()
    {
    vector< vector< meinstruct > > meineDaten;
    
    meineFunktion(?)
    
    }
    

    die Fragezeichen sind mein Problem.

    Veen Dank euch an euch (!), das hilft mir bei einer wichtigen Arbeit und mit meinem c++ Buch komme ich da nicht weiter ebenso liefern google & co auch nur sehr ärmliche Ergebnisse.



  • Du kannst auch einen Zeiger auf einen std::vector haben.. Aber hier würden sich Referenzen anbieten. (auch zum Schutz vor 0 Zeigern)

    meineFunktion( std::vector<std::vector< meinstruct> >& daten)
    {
    //bearbeite die Daten
    }
    
    int main() // int main, nicht void main!
    {
    vector< vector< meinstruct > > meineDaten;
    
    meineFunktion( meineDaten );
    
    }
    


  • Ich würde dir raten, bei komplexeren Typen wie diesem mit typedef zu arbeiten. Das verschafft dir eine Abstraktion vom konkreten Typ – wenn du nicht zu spezifische Operationen verwendest, kannst du den Container auch bei Bedarf auswechseln. Ausserdem erhältst du so aussagekräftige Bezeichner.

    typedef std::vector<std::vector<MeinStruct> > Datentabelle;
    

    Falls die Funktion das Argument nicht verändern soll, nimmst du Const-Referenzen oder Const-Zeiger. Zeiger musst du zusätzlich dereferenzieren (über * oder -> ).

    void meineFunktion(const Datentabelle* tabelle);
    void meineFunktion(const Datentabelle& tabelle);
    

    Ansonsten lässt du das const weg.



  • Wahnsin... 😮 super fixe Antworten! habt mich damit gerettet!
    vielen Dank an drakon, genau das meinte ich (auch wenn ich mich mit zeigern vl. fasch ausgedrückt habe)
    auch danke an Nexus, guter Tipp, ich blicke meinen eigenen quelltext langsam nichtmehr, da sollte es ein bisschen übersichtlicher machen...



  • Nexus schrieb:

    Ausserdem erhältst du so aussagekräftige Bezeichner. [...] Datentabelle;

    Wobei "Datentabelle" wohl etwas zu generisch ist. Erinnert mich an die tolle Antwort eines Studis damals auf die Frage des Profs was seine Klasse denn macht: "Na, Daten verarbeiten...". 😃



  • Fellhuhn schrieb:

    Wobei "Datentabelle" wohl etwas zu generisch ist.

    Ich habe mir hier wirklich überlegt, ob ich noch einen Kommentar hinsetzen sollte à la "hier was Sinnvolles wählen". Ich bin dann davon ausgegangen, dass braindoc den Schritt zu seinem Projekt schon noch selbst bewerkstelligen kann. 😉

    Ich meine, auf meineDaten und meinStruct trifft dies ja gleichermassen zu. 🙂



  • Hier wäre es angebracht über eine dynamische Reflectionmatrix einen Binarystream einzubinden um somit die Targets und zusätzlich eine nebenläufige Fallbacksicherung zu erreichen.


Anmelden zum Antworten