Überprüfung Wert existiert in einer std :: map - C ++
Ich weiß finden Methode findet die mitgelieferten Schlüssel in std::map und zurück einen iterator auf das element. Gibt es trotzdem, um den Wert zu finden und bekommen Sie einen iterator auf das element? Was ich tun müssen, ist zu prüfen, angegebene Wert existiert in std::map. Ich habe dies getan, indem die Schleife alle Elemente in der Karte anzeigen und vergleichen. Aber ich wollte wissen, gibt es einen besseren Ansatz für dieses.
Hier ist, was ich schrieb
bool ContainsValue(Type_ value)
{
bool found = false;
Map_::iterator it = internalMap.begin(); //internalMap is std::map
while(it != internalMap.end())
{
found = (it->second == value);
if(found)
break;
++it;
}
return found;
}
Bearbeiten
Wie wäre es mit einer anderen Karte intern speichert, Wert,Schlüssel-Kombination. Also ich kann call finden? Ist finden() in std::map der sequenziellen Suche?
Dank
InformationsquelleAutor der Frage Navaneeth K N | 2009-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie boost::multi_index zu erstellen bidirektionale anzeigen - Sie kann entweder den Wert des Paares als Schlüssel für eine schnelle Suche.
InformationsquelleAutor der Antwort Mark Ransom
Wenn Sie Zugriff auf die hervorragenden steigern - Bibliothek, dann sollten Sie mit boost::multi_index zu erstellen bidirektionale anzeigenwie Mark sagt. Im Gegensatz zu std::map dadurch können Sie nachschlagen, indem Sie entweder den Schlüssel oder den Wert.
Wenn Sie nur die STL an hand der folgende code wird den trick tun (Vorlagen-arbeiten mit jeder Art von Karte, wo die mapped_type unterstützt operator==):
InformationsquelleAutor der Antwort CodeBuddy
Ja: pflegen Sie zwei Karten, mit einer Karte mit einem Typ der Schlüssel und der andere mit dem anderen.
Nein, es ist eine binäre Suche in einem sortierten Baum: seine Geschwindigkeit ist O(log(n)).
InformationsquelleAutor der Antwort ChrisW
Blick in boost die bidirektionale maps: http://www.boost.org/doc/libs/1_38_0/libs/bimap/doc/html/index.html
Es können beide Werte wirken wie ein Schlüssel.
Ansonsten iteration ist der Weg zu gehen.
InformationsquelleAutor der Antwort Evan Teran
versuchen, diese Funktion:
ich denke, es ist nützlich,
InformationsquelleAutor der Antwort Mitch
Nicht, haben Sie, um eine Schleife über die std::map, und überprüfen Sie alle Werte manuell ein. Je nachdem, was Sie tun möchten, könnten Sie wickeln die std::map in eine einfache Klasse, die speichert auch alle die Werte, die eingefügt sind in die Karte in etwas, das einfach such-fähig und erlaubt keine Duplikate, wie ein std::setzen. Nicht Erben von std::map (es muss nicht einen virtuellen Destruktor!), aber wickeln Sie es so, dass man etwas tun kann, wie diese:
Alternative, um Ihre eigenen Rollen wäre, um die Boost-bidirektionale map, die ist leicht zu finden in den Beiträgen unten oder von Google.
Es hängt wirklich davon ab, was Sie wollen, wie oft Sie es tun wollen, und wie schwer es ist, Rollen Sie Ihre eigenen kleinen wrapper-Klasse oder der Installation und Nutzung zu Steigern. Ich Liebe Steigern, so dass ein guter Weg zu gehen - aber es ist etwas schönes und komplett über die eigene wrapper-Klasse. Sie haben den Vorteil, verstehen direkt die Komplexität der Vorgänge, und müssen Sie möglicherweise nicht die volle reverse-mapping der Werte => Tasten, durch die Boost-bidirektionale map.
InformationsquelleAutor der Antwort James Thompson
Was Sie fordern, ist genau das, was std::find hat (nicht die member-Funktion)
InformationsquelleAutor der Antwort AKludges
Nicht die beste option, aber könnte nützlich sein, in einigen Fällen, in denen Benutzer zuweisen default-Wert wie 0 oder NULL bei der Initialisierung.
InformationsquelleAutor der Antwort user2761565
Möglich, dass ich nicht vollständig verstehen, was Sie versuchen zu erreichen. Sondern einfach um zu testen, ob oder nicht eine Karte, die einen Wert enthält, ich glaube, Sie können die
std::map
's gebaut infind
.InformationsquelleAutor der Antwort Ternary