2010-11-29 9 views
0

konnte keine Antwort auf Google finden ..std :: map benutzerdefinierte Schlüssel Uneindeutigkeit Problem

Wenn ich std :: string folgende funktioniert gut.

map <fxString, int> test; 
test.insert(pair <fxString, int> ("Bla", 1)); 
test.insert(pair <fxString, int> ("Bla", 2)); 
test.insert(pair <fxString, int> ("Bla", 3)); 
cout << fxInt2String(test["Bla"]) << endl; 

Welche ausgeben sollte 1, sondern gibt 0

Als ich durch die Karte iterieren mich jedes Schlüsselwertpaar gibt, sitzt direkt neben ihnen spöttisch.

fxString definiert die folgenden Operatoren: Operator> Operator < Operator == operator =

Und mehr, und ich testete sie ..

Grom!.

+0

Was ist 'fxString' und' fxInt2String'? –

+1

Wie sieht Ihr '<' Operator aus? – Nim

+0

'Operator <' sollte false für Objekte, die gleich sind, zurückgeben. – Eclipse

Antwort

6

„Wenn ich durch die Karte iterieren jedes Schlüsselwertpaar ist es“

Nun, etwas falsch mit Ihrem fxString::operator< dann, weil die insert Member-Funktion keine Wirkung haben soll, wenn die Schlüssel ist bereits vorhanden. Sind Sie sicher, dass dieser Operator ein strict weak ordering modelliert?

Unter der Annahme, dass der Betreiber gebrochen, test["Bla"] hat die Wirkung der Zugabe noch ein weiteres Element in der Karte mit einem Standardwert von 0.

+2

+1 - Der 'Operator <' ist fast sicher die Ursache für beide Probleme. Der Grund dafür, dass die Karte jeden neuen Datensatz einfügt, ist, dass sie nach "Bla" sucht und sie nicht finden kann. Ebenso kann es beim Abrufen "Bla" nicht finden und gibt einen Standardwert zurück (Hinzufügen eines neuen Paares zur selben Zeit). – Eclipse

+0

@Eclipse: rechts, Antwort bearbeitet, um zu erklären, warum eine 0 angezeigt wird – icecrime

+1

Ich implementierte eine sehr einfache schnelle Überprüfung auf Operator <, aber es würde manchmal wahr zurück, obwohl die beiden Strings identisch sind. Danke Kumpel! =) – Xilliah

0

Dies funktioniert gut (wie Sie festgestellt haben)

map <string, int> test; 
test.insert(pair <string, int> ("Bla", 1)); 
test.insert(pair <string, int> ("Bla", 2)); 
test.insert(pair <string, int> ("Bla", 3)); 
cout << test["Bla"] << endl; 

Also entweder Problem mit Ihrer fxInt2String Funktion oder bei Ihrem Netzbetreiber Überlastungen muss es sein.

Um weitere Hilfe zu erhalten, sollten Sie uns einen Code für die Funktionen zur Verfügung stellen.

+0

-1 für das Lesen der Frage –

+0

Ich habe es natürlich gelesen. Ich habe nur ein Beispiel gegeben, das funktioniert (und der Autor ist sich dessen bewusst). Die Antwort selbst lautet also: "Es muss entweder ein Problem mit Ihrer fxInt2String-Funktion oder mit Ihren Operator-Überladungen geben." Ohne weiteren Code können wir nicht viel tun. – Palmik

+0

Für Ihre Zufriedenheit auf jeden Fall bearbeitet: P – Palmik

Verwandte Themen