2010-10-07 5 views
107

Der einzige Weg, den ich gefunden habe, um nach Duplikaten zu suchen, ist durch Einfügen und Überprüfen der std::pair.second für false, aber das Problem ist, dass dies noch etwas einfügt, wenn der Schlüssel nicht verwendet wird, was ich will ist eine map.contains(key); Funktion.Wie überprüft man, ob std :: map einen Schlüssel enthält, ohne Einfügen?

+3

möglich Duplikat [Wie wenn ein bestimmte Schlüssel existiert in einer C++ std :: map finden] (http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog

Antwort

231

Verwenden Sie my_map.count(key); Es kann nur 0 oder 1 zurückgeben, was im Wesentlichen das gewünschte boolesche Ergebnis ist.

Alternativ my_map.find(key) != my_map.end() funktioniert auch.

+5

-1: Sollte 'find' verwenden. Es ist mindestens so effizient wie "count" für Karten und Multimaps und effizienter, wenn Sie die typische Notwendigkeit betrachten, Änderungen an den gefundenen Schlüsseln vorzunehmen. –

+29

@John: Das riecht nach vorzeitiger Optimierung. Auf GCC (und ich bin mir sicher, die meisten vernünftigen Systeme), wird 'map :: count' als' find (__ x) == end()? 0: 1; '. Für "multimap" haben Sie vielleicht ein Performance-Argument, aber das ist nicht die Frage von OP und ich bevorzuge immer noch Eleganz. – Potatoswatter

+24

Nein, das vorzeitige Optimierungsargument ist nur gültig, wenn die Optimierung etwas Aufwand erfordert, was in diesem Fall nicht der Fall ist. – markh44

39

Potatoswatter's Antwort ist in Ordnung, aber ich bevorzuge stattdessen find oder lower_bound. lower_bound ist besonders nützlich, da der zurückgegebene Iterator anschließend für eine angedeutete Einfügung verwendet werden kann, wenn Sie etwas mit demselben Schlüssel einfügen möchten.

map<K, V>::iterator iter(my_map.lower_bound(key)); 
if (iter == my_map.end() || key < iter->first) { // not found 
    // ... 
    my_map.insert(iter, make_pair(key, value));  // hinted insertion 
} else { 
    // ... use iter->second here 
} 
+0

Dies ist subtil anders als, wie er sagt er macht es ... der einzige Unterschied ist, dass die Berechnung von "Wert" übersprungen werden kann, wenn das Einfügen nicht notwendig ist. – Potatoswatter

+0

Sicher, ich verstehe, dass das OP nicht gerne einfügen, so dass eine 'Lower_bound'-basierte Lösung übertrieben ist. Ich habe gerade meine Antwort "aus Gründen der Vollständigkeit" erwähnt; Wie ich schon sagte, deins ist vollkommen ausreichend. :-) –

+3

Ja, das ist eine gute Antwort und ich stimme überhaupt nicht zu. Nur die Beziehung zu der Alternative von "einfügen" a priori. Tatsächlich gibt es einen weiteren Unterschied, wenn eine "Multimap" verwendet wird, die "lower_bound" -Methode am Anfang des äquivalenten Bereichs eingefügt wird, während die einfache "insert" -Methode am Ende des Bereichs hinzugefügt wird. – Potatoswatter

Verwandte Themen