std::sort sortiert vector nicht vollständig



  • Hallo,

    ich weiß nicht, wo mein Fehler liegt. Ich habe folgenden Vector:

    std::vector<Element> vecData;
    

    Wobei Element wie folgt aussieht:

    class Element {
        public:
        // ctor 
    
        // Weitere Member
    
        Point2d m_point;  // double x, double y
    };
    

    Nun wird vecData gefüllt und ich möchte ihn sortieren, und zwar nach der x-Koordinate. Hierfür habe ich definiert:

    bool operator<(const Element & p1, const Element & p2) {
    	return (p1.m_point.x < p2.m_point.x);
    }
    

    Sortieren:

    std::sort(vecData.begin(), vecData.end());
    

    Problem:

    Ich schreibe die x-Werte vor und nach dem Sortieren in eine Datei. Es wird zwar sortiert, aber nicht gänzlich korrekt. Das sehe ich, wenn ich mit Matlab das "sortierte" Ergebnis nochmal sortiere und dann vergleiche. Hier mal ein Beispiel:

    Auszug unsortiert:

    7.84489449880666
    7.854832525784217
    7.855502000161023
    7.846657579986165
    7.851022442727947
    7.860771401233759
    7.864081860825058
    7.8455106132252
    [...]
    

    "Sortiert":

    7.84489449880666
    7.8455106132252
    7.845896795822748
    7.846264271448749
    7.846244286403353
    7.84626155973324
    7.846419006019873
    7.846507838726909
    [...]
    

    Zeilen 4 und 5 sind schon nicht korrekt sortiert (5. Nachkommastelle). Matlab's sort-Funktion macht es korrekt:

    7.844894498806660
    7.845510613225200
    7.845896795822748
    7.846244286403353
    7.846261559733240
    7.846264271448749
    7.846419006019873
    7.846507838726909
    

    Ich verstehe aber nicht, was ich hier falsch mache. std::sort scheint ja gefühlt schon 75% korrekt zu sortieren 😕



  • Der Fehler wird wohl in dem Code liegen, den du nicht zeigst (z.B. Selbst geschriebene Zuweisungsoperatoren). Das mit dem übersetzbaren Minimalbeispiel hat schon seinen Grund ...



  • manni66 schrieb:

    Der Fehler wird wohl in dem Code liegen, den du nicht zeigst (z.B. Selbst geschriebene Zuweisungsoperatoren). Das mit dem übersetzbaren Minimalbeispiel hat schon seinen Grund ...

    An welcher Stelle/Klasse muss ich denn suchen? In Point2d?

    Überladen wären hier ==, +=, -=, -, +


  • Mod

    991SE schrieb:

    manni66 schrieb:

    Der Fehler wird wohl in dem Code liegen, den du nicht zeigst (z.B. Selbst geschriebene Zuweisungsoperatoren). Das mit dem übersetzbaren Minimalbeispiel hat schon seinen Grund ...

    An welcher Stelle/Klasse muss ich denn suchen? In Point2d?

    Überladen wären hier ==, +=, -=, -, +

    Wenn du nicht weißt, wo du suchen musst, dann lass uns suchen. Das geht natürlich nur, wenn du uns auch den Code zeigst. Wie schon gesagt: Compilierbares Minimalbeispiel.
    Wie man Probleme nachstellbar und nachvollziehbar macht


Anmelden zum Antworten