c++-standard-library

___ qstntxt ___

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 !!!

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer5886646 ___

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 %code% - 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.

    
___ tag123cstandardbibliothek ___ In der Programmiersprache C ++ ist die C ++ - Standardbibliothek eine Sammlung von Klassen und Funktionen, die in der Kernsprache geschrieben sein können oder auch nicht und Teil von C ++ sind ___ answer5886649 ___

%code% benötigt einen gültigen Comperator, der sich wie %code% oder %code% 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 %code% aus, nicht wie ein %code%

Eine der Regeln, der ein %code% folgen sollte, ist, dass %code% und %code% nicht beide wahr sein können. In Ihrer Implementierung ist es.

Korrigieren Sie Ihren Code zu:

%Vor%

und dir sollte es gut gehen.

    
___ answer5881701 ___

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 %code%

benutzt habe     
___ qstnhdr ___ Erhalte "Debug Assertion Failed!" für den gesetzten Vergleicher ___
1
Antwort

Kann eine Standardbibliotheksimplementierung Standardtypen spezialisieren?

Nehmen wir zum Beispiel für das Argument an, dass eine effizientere Implementierung (Speichern, Operationen darauf) für einen Vektor ganzzahliger Typen gefunden wird (im Vergleich zur generischen Vektorimplementierung). Kann eine standardkonforme...
03.07.2015, 15:40
3
Antworten

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

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. Dahe...
28.04.2011, 18:44