web-dev-qa-db-fra.com

STL <map> permet les paires en double?

J'ai écrit le code suivant et j'ai été surpris par la sortie. J'ai entendu dire que <map> évite la collision de clés, mais ici, il semble permettre l'insertion de paires dupliquées.

#include<iostream>
#include<map>

using namespace std;

int main()
{
    map<string,char> namemap;
    namemap["yogi"]='c';

    namemap.insert(pair<string,char>("yogendra",'a'));
    namemap.insert(pair<string,char>("yogendra",'b'));

    cout<<namemap["yogendra"]<<endl;

    return 0;
}

Ce code génère a. Vous pouvez l'exécuter sur C++ Shell .

Éviter la collision signifie-t-il que nous ne pouvons pas entrer plusieurs paires avec la même clé?

13
dead programmer

La seconde insert avec la même clé est un no-op. Il renvoie simplement un itérateur pointant sur l'élément existant.

std::map::insert() a une valeur de retour, que vous devriez vérifier.

Il est de type std::pair<iterator,bool>. Le deuxième élément de la paire vous indique si l'élément a été inséré ou s'il existe déjà une entrée avec la même clé.

cout << namemap.insert(pair<string,char>("yogendra",'a')).second << endl;
cout << namemap.insert(pair<string,char>("yogendra",'b')).second << endl;
42
NPE

La carte STL n'autorise pas l'utilisation des mêmes clés. Vous voudrez peut-être opter pour la multi-carte pour cela.

7
Jay D

map n'émettra aucune erreur de compilation/exécution lors de l'insertion d'une valeur à l'aide d'une clé dupliquée. mais lors de l'insertion, l'utilisation de la clé dupliquée n'insère pas de nouvelle valeur, elle renvoie uniquement la même valeur existante. il ne sera pas écrasé. mais dans le cas ci-dessous, il sera écrasé.

map<char,int> m1;
m1.insert(pair <char, int> ('a', 40));
m1['a']=50;
cout << "a => " << m1.find('a')->second << '\n';

Le résultat sera 50.

ci-dessous par exemple, il ne sera pas écrasé.

map<char,int> m1;
m1.insert(pair <char, int> ('a', 40));
m1.insert(pair <char, int> ('a', 50));
cout << "a => " << m1.find('a')->second << '\n';

Le résultat sera 40.

Rappelez-vous la taille de la carte 1 ici pour les deux cas.

cout <"size =" << m1.size () << '\ n'; il sera 1 dans les deux cas.

0
ashutosh