[C++] So finden Sie, ob ein bestimmter Schlüssel in einer C ++ std :: map existiert


Answers

Um zu überprüfen, ob ein bestimmter Schlüssel in der Zuordnung vorhanden ist, verwenden Sie die count auf eine der folgenden Arten:

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

Die documentation für map::find besagt: "Eine andere Elementfunktion, map::count , kann verwendet werden, um einfach zu prüfen, ob ein bestimmter Schlüssel existiert."

Die map::count für map::count lautet: "Da alle Elemente in einem Kartencontainer eindeutig sind, kann die Funktion nur 1 (wenn das Element gefunden wird) oder 0 (andernfalls) zurückgeben."

Um einen Wert aus der Karte über einen Schlüssel abzurufen, den Sie kennen, verwenden Sie map::at :

value = m.at(key)

Im Gegensatz zu map::operator[] map::at keinen neuen Schlüssel in der Map, wenn der angegebene Schlüssel nicht existiert.

Question

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

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 drucken, was in p ist?




template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
    return (container.find(key) != std::end(container));
}

Natürlich könnten Sie, wenn Sie schicker werden möchten, immer eine Funktion ausformulieren, die auch eine gefundene Funktion und eine nicht gefundene Funktion verwendet, etwa so:

template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
    auto& it = container.find(key);
    if (it != std::end(container))
    {
        found_function(key, it->second);
    }
    else
    {
        not_found_function(key);
    }
}

Und benutze es so:

    std::map<int, int> some_map;
    find_and_execute(some_map, 1,
        [](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
        [](int key){ std::cout << "key " << key << " not found" << std::endl; });

Der Nachteil ist ein guter Name, "find_and_execute" ist peinlich und ich kann mir nichts Besseres einfallen lassen ...




map<string, string> m;

check key existiert oder nicht, und return number of tritt auf (0/1 in map):

int num = m.count("f");  
if (num>0) {    
    //found   
} else {  
    // not found  
}

check key exist oder nicht und return iterator:

map<string,string>::iterator mi = m.find("f");  
if(mi != m.end()) {  
    //found  
    //do something to mi.  
} else {  
    // not found  
}  

in Ihrer Frage, der Fehler durch die operator<< Überladung operator<< verursacht, weil p.first ist map<string, string> , können Sie es nicht ausdrucken. Versuche dies:

if(p.first != p.second) {
    cout << p.first->first << " " << p.first->second << endl;
}



m.find == m.end() // not found 

Wenn Sie eine andere API verwenden möchten, suchen Sie nach m.count(c)>0

 if (m.count("f")>0)
      cout << " is an element of m.\n";
    else 
      cout << " is not an element of m.\n";



map <int , char>::iterator itr;
    for(itr = MyMap.begin() ; itr!= MyMap.end() ; itr++)
    {
        if (itr->second == 'c')
        {
            cout<<itr->first<<endl;
        }
    }