std::string als Schlüssel in std::map mit einem Vergleichsoperator
Ich versuche, einen std::string als Schlüssel in eine std::map allerdings bin ich nicht in der Lage zu finden() richtig. Mein code ist etwas kompliziert und groß, so das ist ein kleines Programm, das zeigt ein problem, das ich habe. Wenn jemand mir sagen könnte warum das nicht funktioniert, wäre ich sehr dankbar.
Dank.
#include <stdio.h>
#include <string>
#include <map>
struct comparer
{
public:
bool operator()(const std::string x, const std::string y)
{
return x.compare(y)==0;
}
};
int main(int argc, char *argv[])
{
std::map<std::string, int, comparer> numbers;
numbers.insert(std::pair<std::string,int>("One",1));
numbers.insert(std::pair<std::string,int>("Two",2));
numbers.insert(std::pair<std::string,int>("Three",3));
numbers.insert(std::pair<std::string,int>("Four",4));
numbers.insert(std::pair<std::string,int>("Five",5));
std::map<std::string, int, comparer>::iterator it=numbers.find("Three");
if(it!=numbers.end())
printf("The number is %d\n",(*it).second);
else
printf("Error, the number is not found\n");
}
InformationsquelleAutor Chromex | 2011-12-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entfernen Sie Ihre
comparer
und es wird funktionieren just fine. Die Sache ist, Sie nicht es richtig umsetzt. Sollte es wiedertrue
wennx
platziert werden vory
. Oder ändern==0
zu<0
oder>0
(es ist nicht wirklich wichtig).Du bist willkommen, aber sicher sind, dass Zweifel über die Entfernung. Wenn Sie ersetzen Sie alle vorkommen von
std::map<std::string, int, comparer>
mitstd::map<std::string, int>
wird es sicher funktionieren.Das problem ich habe in meinem Haupt-Anwendung ist, dass ich überprüfen Sie nach Duplikaten in der Karte, bevor Sie hinzufügen ein neues paar. Es ist jedoch nicht zu erkennen, die Duplikate richtig
Ich redete über diesen code, nicht Ihre Anwendung, natürlich. Für Duplikate,
map
ist nicht erlaubt zu haben, im Gegensatz zumultimap
.eigentlich ist diese doesn ' t scheint der Fall zu sein, wenn ich zwei Paare, die den gleichen Schlüssel-Wert, Durchlaufen die Karte zeigt 2 Einträge mit dem gleichen Schlüssel.
InformationsquelleAutor Michael Krelin - hacker
comparer::operator()
sollte der Rückgabewert von operator <, nicht von operator ==.InformationsquelleAutor Griwes
std::map
(undset
und Ihremulti
Varianten) durchsetzen strenge schwache bestellen.True zurück, wenn die strings sind gleich. Der comparer zurückkehren sollte, ob der erste string sollte gehen, bevor die zweite Zeichenfolge. Entweder zurückgeben
x ist.vergleichen(y) < 0
oder lassen Sie einfach Ihre Vergleich funktors aus.InformationsquelleAutor Xeo
Sollte dies funktionieren:
InformationsquelleAutor 李则博