2016-09-11 2 views
1
int main() { 
    vector<string> v(100, "0"); 
    auto comp = [](const string& first, const string& second)->bool { 
     return first.compare(second) <= 0; 
    }; 
    sort(v.begin(), v.end(), comp); 
    for(auto s : v) { 
     cout<<s<<endl; 
    } 
    return 0; 
} 

Oberhalb C++ Code bekam Segmentierung Fehler mit g ++ v4.9.2. es ist so verkabelt. Wer weiß was vor sich geht?Segmentation Fault: C++ sortiere einen String Vektor mit Lambda-Komparator

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Ich kann nicht in die Sortierfunktion debuggen, also bin ich hier ... aber ich sollte die Kommentare der Sortierfunktion sorgfältig lesen. –

+0

Warum können Sie nicht debuggen? Bitte erläutern. –

Antwort

6

Ihre Vergleichsfunktion ist nicht gültig. Es schlägt sowohl bei der Irreflexion fehl (comp (x, x) sollte nie wahr sein) und Asymmetrie (wenn comp (x, y) wahr ist, dann muss comp (y, x) falsch sein), die beide sind Teil der strict weak ordering welche std::sort für ihren Komparator benötigt. operator< oder operator>10 erfüllen diese Anforderung. Aber operator<= und operator>= nicht.

Wenn Sie Ihre Vergleichsfunktion dies zu ändern:

auto comp = [](const string& first, const string& second)->bool { 
    return first.compare(second) < 0; 
}; 

Es wird funktionieren. Natürlich ist das funktional identisch mit dem, was Sie als Standard erhalten, also können Sie einfach Folgendes tun:

+0

sehr klar, vielen Dank. –