Erhalte "Debug Assertion Failed!" für den gesetzten Vergleicher

7

Ich weiß, dass ein ähnliches Problem unter diesem Link beantwortet wurde Hilf mir, dieses C ++ zu beheben std :: setze Komparator Aber leider habe ich genau das gleiche Problem, und ich bin nicht in der Lage, den Grund dafür zu verstehen. Daher brauche ich Hilfe, um es zu lösen.

Ich verwende VS2010 und meine Release-Binärdatei läuft ohne Probleme, aber die Debug-Binärberichte:

Mein Komparator sieht so aus:

%Vor%

Mein Satz wird wie folgt deklariert:

%Vor%

Könnte mir jemand vorschlagen, warum meine Debug-Binärdatei bei dieser Behauptung versagt? Liegt es daran, dass ich die Funktion wcscmp () verwende, um die breite Zeichenfolge zu vergleichen, die in meinem Set gespeichert wird?

Vielen Dank im Voraus !!!

    
sactiw 28.04.2011, 18:44
quelle

3 Antworten

15

std::set benötigt einen gültigen Comperator, der sich wie operator< oder std::less verhält.

Der std :: set-Code hat erkannt, dass Ihr Operator & lt; ist nicht gültig, und als eine Hilfe für Sie ausgelöst die Behauptung, die Sie zeigten.

Und tatsächlich: Ihr Partner sieht wie ein operator!= aus, nicht wie ein operator<

Eine der Regeln, der ein operator< folgen sollte, ist, dass a<b und b<a nicht beide wahr sein können. In Ihrer Implementierung ist es.

Korrigieren Sie Ihren Code zu:

%Vor%

und dir sollte es gut gehen.

    
Sjoerd 04.05.2011 16:25
quelle
9

Das Problem ist, dass Ihr Komparator keine streng-schwache Ordnung induziert. Es sollte nur für Pfade, die "weniger" sind, wirklich zurückkehren - nicht für alle, die anders sind. Ändere es zu:

%Vor%

Alternativ funktioniert auch die Verwendung von c > 0 - aber die Menge hat eine umgekehrte Reihenfolge.

Der Algorithmus muss den Unterschied zwischen kleiner und größer wissen, um zu arbeiten, nur ungleiche gibt nicht genug Informationen. Ohne Informationen kleiner als / größer als, kann die Menge möglicherweise keine Reihenfolge beibehalten - aber darum geht es in einer Menge.

    
ltjax 04.05.2011 16:25
quelle
1

Nachdem wir etwas mehr Zeit damit verbracht haben, haben wir uns entschieden, einen anderen Ansatz zu wählen, der für mich funktioniert hat.

Also haben wir wchar_t * mit dieser Methode in einen String konvertiert:

%Vor%

Und dann habe ich diese Zeichenfolge im Set gespeichert. Dadurch musste ich mir keine Gedanken über den Vergleich der Elemente machen, die gespeichert werden, um sicherzustellen, dass alle Einträge eindeutig sind.

%Vor%

Alles was ich tun musste war:

%Vor%

Obwohl ich immer noch nicht weiß, was "Debug Assertion Failed" verursacht hat, als ich a set comparator (PathComp) for set<wchar_t*,PathComp> pathSet;

benutzt habe     
sactiw 04.05.2011 10:04
quelle

Tags und Links