2009-06-29 4 views
2

Dies ist der Code:C++ std :: set Komparator

struct comp 
{ 
    bool operator()(Reputation *one, Reputation *two) 
    { 
     if (one->Amount < 0 && two->Amount >= 0) 
      return false; 
     if (one->Amount >= 0 && two->Amount < 0) 
      return true; 

     if (one->Amount >= 0) 
      return one->Amount <= two->Amount; 
     else 
      return one->Amount >= two->Amount; 
    } 
}; 

Und das ist das Problem:

Debug Assertion Failed!
Datei: .. \ VC \ include \ xtree
Line: 638

Expression: ungültiger Operator <

Danach kann ich "Abbruch", "Wiederholen" oder "Ignorieren" wählen. Wenn ich ignoriere, kommen viele (identische) auf, aber es funktioniert perfekt.

Das Problem scheint zu auftreten, wenn ich eine Reputation mit -> Amount == zu einem der zuvor eingefügten Reputation * einfügen, aber ich bin mir nicht sicher über dieses letzte.

Jede Hilfe sehr

EDIT würde geschätzt: Die Reihenfolge ich sie will bestellt in zunächst die positiven in asc Ordnung, dann die negativen in absteigend sortiert. Beispiel: 1 5 10 11 11 20 50 -1 -5 -50

Antwort

6

Sie müssen eine Beziehung definieren, die irreflexive ist, genau wie < - daher ändert sich die <=-< und die '> =' to ' > in den letzten paar Vergleichen in Ihrer Methode. Dies ist, was VC++ diagnostiziert.

Außerdem Bei einer richtig codiert, <- wie Operator, wenn zwei Punkte a und b so sind, dass ein < b und b < a beide falsch sind, werden diese Elemente als äquivalent und daher wird nur eines in der Menge eingesetzt werden (Es ist nicht wesentlich, ob die Punkte durch einen anderen Vergleich unterschieden werden könnten: nur die Äquivalenzbeziehung, auf die sich der Komparator bezieht).

+0

Danke, das hat es behoben. Sehr geschätzt! –

+0

Ich bin froh, dass ich geholfen habe, das "debug assertion failed" Problem zu beheben, aber lies bitte meine letzte Bearbeitung über "uniqueness" - du brauchst eine Multiset, wie @Kasprzol sagt, wenn du mehrere Items behalten willst, die nicht unterscheidbar sind Komparator_. –

+0

Ja, ich habe es bereits auf Kasprozls Rat hin zu einem Multiset konvertiert! –

0

Sie nicht dieselben Werte in std :: Satz einfügen können, bedarf es eindeutige Werte. Verwenden Sie std :: multiset.

Für Ihre lustige Bestellung dies scheint zu funktionieren:

struct comp 
{ 
    bool operator()(const Reputation *a, const Reputation *b) 
    { 
     if (a->Amount < 0 && b->Amount < 0) 
      return a->Amount > b->Amount; 
     else if (a->Amount < 0) return false; 
     else if (b->Amount < 0) return true; 
     else return a->Amount < b->Amount; 
    } 
}; 
+0

Das Set besteht aus einer Reihe von Zeigern. Sie sind alle einzigartig, auch wenn einige gleich sind -> Menge. Dies ist der genaue Code: \t multiset sortiert; \t für (Reputation * rep = Reputation :: GetReputationTable(); rep-> Id; ++ rep) \t \t sortierte.insert (rep); –

+0

Oh ok, es war nicht klar aus dem Beispiel ... aber ja, wenn Sie Zeiger speichern Zeiger verwenden – stefanB