En fait la méthode d'insertion qui prend un paramètre d'indication ne retourne pas si l'insertion a réussi ou non. Une façon de vérifier si l'insertion s'est réellement produite serait de vérifier la taille de la carte avant et après l'insertion. Si c'est la même chose, alors l'insertion a échoué (c'est-à-dire que la clé était déjà présente). Je sais que cela semble moche, mais c'est le moyen le plus efficace que je puisse trouver. En fait, je crois qu'il n'y a aucune raison impérieuse pour que l'insert avec un indice ne renvoie pas une paire (y compris le bool) comme le fait l'insert normal sans indice. Mais une fois qu'il a été spécifié dans une norme plus ancienne, il est très difficile de le changer, car il s'agit d'un changement avec rupture, que la communauté C++ déteste le plus souvent.
Réponse originale (mauvaise)
Voir ce lien
... renvoie une paire, avec son membre pair::first
défini sur un itérateur pointant soit sur l'élément nouvellement inséré, soit sur l'élément qui avait déjà la même valeur dans la carte. Le pair::second
élément de la paire est défini sur true si un nouvel élément a été inséré ou sur false si un élément de même valeur existait.
Le lien contient également un exemple
Par exemple :
if(mp.insert(make_pair(key, value)).second == false)
{
cout << "Insertion failed. Key was present"
}
typedef std::map<std::string, int> map;
map m;
std::pair<map::iterator,bool> result = m.insert(std::make_pair("hi", 42));
result.second contient ce que vous voulez
Cela dépend de ce que vous entendez par échec ou réussite.
std::map::insert
réussit lorsqu'il insère le nouvel élément, sinon il renvoie un itérateur vers un élément déjà existant.
std::map::insert
échoue s'il n'y a pas assez de mémoire pour insérer un nouvel élément et lance std::bad_alloc
.