Tatsächlich gibt die Einfügemethode, die einen Hinweisparameter annimmt, nicht zurück, ob die Einfügung erfolgreich war oder nicht. Eine Möglichkeit zu überprüfen, ob das Einfügen tatsächlich stattgefunden hat, besteht darin, die Größe der Karte vor und nach dem Einfügen zu überprüfen. Wenn es dasselbe ist, dann ist das Einfügen fehlgeschlagen (d. h. der Schlüssel war bereits vorhanden). Ich weiß, es klingt hässlich, aber das ist der effizienteste Weg, der mir einfallen könnte. Tatsächlich glaube ich, dass es keinen zwingenden Grund dafür gibt, dass die Einfügung mit einem Hinweis kein Paar (einschließlich des bool) zurückgeben sollte, genau wie die reguläre Einfügung ohne Hinweis. Aber sobald es in einem älteren Standard spezifiziert wurde, ist es sehr schwer, es zu ändern, da es sich um eine bahnbrechende Änderung handelt, die die C++-Community meistens ablehnt.
Ursprüngliche (falsche) Antwort
Siehe diesen Link
... gibt ein Paar mit seinem Element pair::first
zurück set auf einen Iterator, der entweder auf das neu eingefügte Element oder auf das Element zeigt, das bereits denselben Wert in der Map hatte. Die pair::second
Das Element im Paar wird auf true gesetzt, wenn ein neues Element eingefügt wurde, oder auf false, wenn ein Element mit demselben Wert vorhanden war.
Der Link enthält auch ein Beispiel
Zum Beispiel:
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 enthält, was Sie wollen
Es hängt davon ab, was Sie mit fehlgeschlagen oder erfolgreich meinen.
std::map::insert
ist erfolgreich, wenn es das neue Element einfügt, andernfalls gibt es einen Iterator an ein bereits vorhandenes Element zurück.
std::map::insert
schlägt fehl, wenn nicht genügend Speicher vorhanden ist, um ein neues Element einzufügen, und löst std::bad_alloc
aus .