Ergebnis 1 bis 8 von 8

[C++] Objekte in Vektor sortieren

  1. #1 Zitieren
    Dea
    Registriert seit
    Aug 2005
    Beiträge
    13.540
    moin

    ich habe einen Vektor mit ca 20 Objekten. Die Objekte möchte ich nach drei Kriterien sortieren und in einen neuen Vektor schreiben. Und zwar hat jedes Objekt drei "wichtige" Integerwerte a,b und c. Jetzt möchte ich aufsteigend sortieren: Die Objekte mit dem größten a hinten, die mit dem kleinsten vorne. Bei gleichem a soll nach b beschaut werden, größeres b -> weiter hinten. Und bei gleichem b soll auf c geschaut werden.
    Gibt es irgendeine sortierungsfunktion, die das elegant für mich löst? Wie gehe ich da am besten ran?
    Und dann noch eine Frage: Wenn ich eine sortier-Funktion habe, sollte ich die dann lieber schachteln, oder für jedes Objekt einen neuen Integerwert anlegen, in dem a,b und c jeweils mit gewichtungsfaktor addiert werden, und dann nur nach diesem wert sortieren?
    Dark_Tengulist ist offline

  2. #2 Zitieren
    Erzbaron Avatar von Mielas
    Registriert seit
    Nov 2003
    Ort
    █████████████████
    Beiträge
    12.227
    so standard sortier algorithmen wären bubblesort oder quicksort.
    kannst du natürlich selber implementieren oder du nutzt fertige funktionen. z.b qsort aus der stdlib
    Mielas ist offline

  3. #3 Zitieren
    Dea
    Registriert seit
    Aug 2005
    Beiträge
    13.540
    Zitat Zitat von Mielas Beitrag anzeigen
    so standard sortier algorithmen wären bubblesort oder quicksort.
    kannst du natürlich selber implementieren oder du nutzt fertige funktionen. z.b qsort aus der stdlib
    ok, also qsort macht im grunde genommen nichts anderes, als je zwei pointer an eine von mir geschriebene vergleichsfunktion zu geben. wie komme ich jetzt von diesen pointern, die ja auf den anfang meines objekts zeigen, auf meinen integer, der ja irgendwo in diesem objekt liegt?
    Dark_Tengulist ist offline

  4. #4 Zitieren
    Drachentöter Avatar von Marthog
    Registriert seit
    Apr 2009
    Beiträge
    4.986
    Verschiedene Sortieralgorithmen

    Bei 20 Objekten ist die Effizienz des Algorithmusses vernachlässigbar und man kann auch den sehr einfach zu implementierenden Selectionsort nehmen. Wenn du nicht gerade lernen willst, wie die Sortieralgorithmen funktionieren, solltest du auf die Standart-libraries zurückgreifen, also am Besten auf die Funktion std::sort.

    EDIT: Nimm nicht qsort, der Algorithmus ist Teil der alten C-Libraries, nicht konform zum C++-Standart und nicht sicher genug.

    Code:
    #include <algorithm>
    
    int main()
    {
    	std::vector<int> vec;
    
    	// ...
    
    	std::sort(vec.begin(), vec.end());
    }
    In diesem Fall wird der operator < des Typs verwendet. Hier bei integern ist dieser Operator automatisch definiert, bei eigenen Klassen musst du das selber machen. Alternativ kann als dritter Parameter auch eine Funktion oder ein function object angegeben werden, mit zwei Parametern des entsprechenden Typs.
    Für Modder: Gothic NPC-Viewer
    Marthog ist offline Geändert von Marthog (30.11.2012 um 19:10 Uhr)

  5. #5 Zitieren

    Batmanistrator
    Avatar von Thoronador
    Registriert seit
    Jul 2005
    Ort
    Morrowind, Vvardenfell-Distrikt
    Beiträge
    20.429
    Zitat Zitat von Mielas Beitrag anzeigen
    oder du nutzt fertige funktionen. z.b qsort aus der stdlib
    Das wäre zwar möglich, aber unnötigerweise umständlich, zu unsicher sowie möglicherweise auch nicht unbedingt performant, weil es eine reine C-Funktion ist, die mit C++ erstmal nichts am Hut hat. Für einen std::vector ist das suboptimal.
    Besser kommt man in dem Fall mit std::sort().

    Das könnte im beschriebenen Fall mit den drei Werten a, b und c in einem Objekt so aussehen:
    Code:
    #include <algorithm>
    #include <vector>
    
    struct Object
    {
      int a, b, c;
    };
    
    //Vergleichsfunktion
    bool compareObject(const Object& x, const Object& y)
    {
      if (x.a<y.a) return true;
      if (x.a>y.a) return false;
      if (x.b<y.b) return true;
      if (x.b>y.b) return false;
      return (x.c<y.c);
    }
    
    int main(void)
    {
      std::vector<Object> vec;
      // Vektor befüllen
      ...
      //sortieren
      std::sort(vec.begin(), vec.end(), compareObject);
    
      //ausgeben, weiterverarbeiten,...
      ...
    }
    Thoronador ist offline

  6. #6 Zitieren
    Dea
    Registriert seit
    Aug 2005
    Beiträge
    13.540
    hm, ich habs mir jetzt gerade mit qsort zusammengebastelt. bin da mit den pointer-typen etwas durcheinander gekommen. aber es läuft jetzt so, wie es soll. danke dafür.

    bei gelgenheit werd ich dann auf sort "umrüsten", sollte nicht allzu viel aufwand sein

    edit: hab mich übrigens doch dafür entschieden, die drei werte zu einem zusammenzufassen. dann kann ich einfachher änderungen vornehmen...
    Dark_Tengulist ist offline Geändert von Dark_Tengulist (30.11.2012 um 20:42 Uhr)

  7. #7 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von Thnallgzt Beitrag anzeigen
    Gibt es irgendeine sortierungsfunktion, die das elegant für mich löst?
    Ja, gibt's: std::sort().

    Zitat Zitat von Thnallgzt Beitrag anzeigen
    Wie gehe ich da am besten ran?
    Vergleichsfunktion schreiben und an std::sort() übergeben.

    Zitat Zitat von Thnallgzt Beitrag anzeigen
    Wenn ich eine sortier-Funktion habe, sollte ich die dann lieber schachteln, oder für jedes Objekt einen neuen Integerwert anlegen, in dem a,b und c jeweils mit gewichtungsfaktor addiert werden, und dann nur nach diesem wert sortieren?
    Das kommt auf die Sortierfunktion an, die du dir ausgesucht hast.
    ojas ist offline

  8. #8 Zitieren
    Provinzheld Avatar von Cheesecake
    Registriert seit
    Feb 2012
    Beiträge
    266
    Zitat Zitat von Thnallgzt Beitrag anzeigen
    bei gelgenheit werd ich dann auf sort "umrüsten", sollte nicht allzu viel aufwand sein
    Das solltest du wirklich sofort tun. qsort ist nicht nur hässlicher, unsicherer, aufwendiger, langsamer und konkret auf Arrays beschränkt, es führt bei nicht-PODs auch noch zu undefiniertem Verhalten und du brauchst dich dann nicht wundern, wenn dir die ganze Sache plötzlich um die Ohren fliegt. Wenn ein Programm mit UB das Richtige tut, ist das nichts weiter als reines Glück.

    Edit: Das gilt übrigens nur bis einschließlich C++03. Mit dem neuen Standard müsste es reichen, wenn der Typ der Objekte trivial ist, aber das ist gerade nur gefährliches Halbwissen. ^^
    Cheesecake ist offline Geändert von Cheesecake (01.12.2012 um 13:16 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •