[c++] Comment trouver si une clé donnée existe dans un C ++ std :: map


Answers

Pour vérifier si une clé particulière existe dans la map, utilisez la fonction de membre count de l'une des manières suivantes:

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

La documentation de map::find dit: "Une autre fonction membre, map::count , peut être utilisée pour vérifier si une clé particulière existe."

La map::count pour map::count dit: "Parce que tous les éléments dans un conteneur de carte sont uniques, la fonction ne peut retourner que 1 (si l'élément est trouvé) ou zéro (sinon)."

Pour récupérer une valeur de la carte via une clé dont vous savez qu'elle existe, utilisez map::at :

value = m.at(key)

Contrairement à map::operator[] , map::at ne créera pas une nouvelle clé dans la map si la clé spécifiée n'existe pas.

Question

J'essaie de vérifier si une clé donnée est dans une carte et ne peut pas le faire:

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

alors comment puis-je imprimer ce qui est en p?




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

Bien sûr, si vous vouliez obtenir un colombophile, vous pourriez toujours créer une fonction qui prendrait aussi une fonction trouvée et une fonction non trouvée, quelque chose comme ceci:

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);
    }
}

Et utilisez-le comme ceci:

    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; });

L'inconvénient est de trouver un bon nom, "find_and_execute" est maladroit et je ne peux rien trouver de mieux sur le dessus de ma tête ...




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



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

Si vous souhaitez utiliser une autre API, recherchez go pour 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<string, string> m;

check key existe ou non, et retourne le nombre de occurences (0/1 sur la carte):

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

check key existe ou non, et retourne l'itérateur:

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

dans votre question, l'erreur causée par une mauvaise surcharge de l' operator<< , car p.first est map<string, string> , vous ne pouvez pas l'imprimer. essaye ça:

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



Links