Ve skutečnosti metoda vkládání, která přebírá parametr nápovědy, nevrací, zda bylo vložení úspěšné nebo ne. Jedním ze způsobů, jak zkontrolovat, zda k vložení skutečně došlo, by bylo zkontrolovat velikost mapy před a po vložení. Pokud je to stejné, vložení selhalo (tj. klíč již byl přítomen). Vím, že to zní ošklivě, ale je to nejúčinnější způsob, na který jsem mohl přijít. Ve skutečnosti se domnívám, že neexistuje žádný přesvědčivý důvod, proč by vložka s nápovědou neměla vrátit pár (včetně bool) stejně jako běžná vložka bez náznaku. Ale jakmile to bylo specifikováno ve starším standardu, je velmi těžké to změnit, protože jde o převratnou změnu, kterou komunita C++ většinou nesnáší.
Původní (nesprávná) odpověď
Viz tento odkaz
... vrací pár s jeho členem pair::first
nastavit na iterátor ukazující buď na nově vložený prvek, nebo na prvek, který již měl v mapě stejnou hodnotu. pair::second
prvek v páru je nastaven na hodnotu true, pokud byl vložen nový prvek, nebo na hodnotu false, pokud existoval prvek se stejnou hodnotou.
Odkaz obsahuje také příklad
Například:
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 obsahuje to, co chcete
Záleží na tom, co máte na mysli pod pojmem neúspěšné nebo úspěšné.
std::map::insert
uspěje, když vloží nový prvek, jinak vrátí iterátor k již existujícímu prvku.
std::map::insert
selže, pokud není dostatek paměti pro vložení nového prvku a vyvolá std::bad_alloc
.