Der einzige Weg , die ich gefunden habe nach Duplikaten überprüfen ist , durch Einfügen und Prüfen des std::pair.second
für false
, aber das Problem ist , dass dies etwas noch einfügt , wenn der Schlüssel nicht verwendet wird, während das, was ich will ist eine map.contains(key);
Funktion.
147
Antworten:
Verwenden Sie
my_map.count( key )
; Es kann nur 0 oder 1 zurückgeben, was im Wesentlichen das gewünschte boolesche Ergebnis ist.Funktioniert auch alternativ
my_map.find( key ) != my_map.end()
.quelle
map::count
wird als implementiertfind(__x) == end() ? 0 : 1;
. Fürmultimap
die haben Sie vielleicht ein Leistungsargument, aber das ist nicht die Frage von OP und ich bevorzuge immer noch Eleganz.has(k)
/contains(k)
wie jede andere vernünftige Kartenklasse auf dem Planeten hinzufügen . Schlechtes Interface-Design. Der find () -Ansatz ist zu ausführlich und dercount(k)
Ansatz steht definitiv nicht in semantischer Parität mithas(k)
. Im Übrigen ist es auch nichtfind(k)
. Überprüfen Sie die Anzahl der Aufrufe zu dieser Frage.Die Antwort von Potatoswatter ist in Ordnung, aber ich bevorzuge es,
find
oderlower_bound
stattdessen zu verwenden.lower_bound
Dies ist besonders nützlich, da der zurückgegebene Iterator anschließend für eine angedeutete Einfügung verwendet werden kann, falls Sie etwas mit demselben Schlüssel einfügen möchten.quelle
value
möglicherweise übersprungen wird, wenn das Einfügen nicht erforderlich ist.lower_bound
Lösungen basierende Lösung übertrieben. Ich habe gerade meine Antwort "der Vollständigkeit halber" erwähnt; Wie ich schon sagte, deine ist vollkommen ausreichend. :-)insert
a priori hinweisen . Tatsächlich gibt es einen weiteren Unterschied, wenn bei Verwendungmultimap
derlower_bound
Methode a am Anfang des äquivalenten Bereichs eingefügt wird, während die einfacheinsert
Methode am Ende des Bereichs hinzugefügt wird.Ihr Desiderat
map.contains(key)
ist für den Entwurf des Standards C ++ 2a geplant . 2017 wurde es von gcc 9.2 implementiert . Es ist auch im aktuellen Clang .quelle