663 Stimmen

Wie findet man heraus, ob ein bestimmter Schlüssel in einer C++ std::map existiert?

Ich versuche zu prüfen, ob ein bestimmter Schlüssel in einer Karte enthalten ist, und kann es irgendwie nicht tun:

typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here

Wie kann ich also drucken, was in p steht?

999voto

Verwenden Sie map::find

if ( m.find("f") == m.end() ) {
  // not found
} else {
  // found
}

401voto

DavidRR Punkte 16458

Um zu prüfen, ob ein bestimmter Schlüssel in der Karte existiert, verwenden Sie die count Mitgliedsfunktion auf eine der folgenden Arten:

m.count(key) > 0
m.count(key) == 1
m.count(key) != 0

Le site Dokumentation para map::find sagt: "Eine weitere Mitgliederfunktion, map::count kann verwendet werden, um zu prüfen, ob ein bestimmter Schlüssel existiert."

Le site Dokumentation para map::count sagt: "Da alle Elemente in einem Map-Container eindeutig sind, kann die Funktion nur 1 (wenn das Element gefunden wird) oder Null (sonst) zurückgeben."

Um einen Wert aus der Map über einen Schlüssel abzurufen, von dem Sie wissen, dass er existiert, verwenden Sie Karte::at :

value = m.at(key)

Anders als map::operator[] , map::at erstellt keinen neuen Schlüssel in der Map, wenn der angegebene Schlüssel nicht existiert.

197voto

Denis Sablukov Punkte 2644

C++20 gibt uns std::map::contains um das zu tun.

#include <iostream>
#include <string>
#include <map>

int main()
{
    std::map<int, std::string> example = {{1, "One"}, {2, "Two"}, 
                                     {3, "Three"}, {42, "Don\'t Panic!!!"}};

    if(example.contains(42)) {
        std::cout << "Found\n";
    } else {
        std::cout << "Not found\n";
    }
}

57voto

Thomas Bonini Punkte 42356

Sie können verwenden .find() :

map<string,string>::iterator i = m.find("f");

if (i == m.end()) { /* Not found */ }
else { /* Found, i->first is f, i->second is ++-- */ }

53voto

WBuck Punkte 4067

C++17 ein wenig vereinfacht mit einer If statement with initializer . Auf diese Weise können Sie Ihren Kuchen haben und ihn auch essen.

if ( auto it{ m.find( "key" ) }; it != std::end( m ) ) 
{
    // Use `structured binding` to get the key
    // and value.
    const auto&[ key, value ] { *it };

    // Grab either the key or value stored in the pair.
    // The key is stored in the 'first' variable and
    // the 'value' is stored in the second.
    const auto& mkey{ it->first };
    const auto& mvalue{ it->second };

    // That or just grab the entire pair pointed
    // to by the iterator.
    const auto& pair{ *it };
} 
else 
{
   // Key was not found..
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X