Iterator wert bei Fehler
-
Wenn ich sowas mache:
auto itr = mTextureMap.insert(std::make_pair(id, std::move(texture)));Welchen wert hat der Iterator, falls aus irgendeinem Grund das Objekt nicht die die map eingesetzt werden konnte?
(mTextureMap.end() ?)Und gibt mTextureMap.erase auch einen Iterator Wert zurück ?
-
Zum Programmieren gehört, eine Referenz benutzen zu können
z.B. die: http://en.cppreference.com/w/cpp/container/map/insert
-
Was bedeutet denn
value_type
in der Reference?
-
Da geht man zurück zur Klasse map und schaut unter Member Types nach.
-
Ah ok danke hätte ich auch selbst drauf kommen können...
Trotzdem habe ich oft Probleme Referenzen von komplexen Klassen zu verstehen.
Z.B. auf http://en.cppreference.com/w/cpp/container/map/erase.
Ich will wissen, wenn ich follgendes mache:mTextureMap.erase(itr);Welchen Wert ich bei einem Fehler bekomme.
Aber in der Referenz steht nurReturn value
1-2) Iterator following the last removed element.Was für einen Wert hat der Rückgabe Wert jetzt bei einem Fehler?
-
DuffCola schrieb:
Was für einen Wert hat der Rückgabe Wert jetzt bei einem Fehler?
Es gibt keinen Fehler. Der übergebene Iterator wird immer gelöscht. (Der Fall, dass ein Key angegeben wird, wird in (3) behandelt)
-
DuffCola schrieb:
Was für einen Wert hat der Rückgabe Wert jetzt bei einem Fehler?
Welcher Fehler?
Entweder du übergibst einen gültigen Iterator, dann geht nichts schief.
Oder du übergibst einen ungültigen Iterator (begin() bei leerem Container, end(), falscher Iterator, etc.), dann ist das undefined behaviour (weil die Funktion einen validen Iterator verlangt) und es ist dem Compilerhersteller überlassen, was er da tun soll.
-
Zurück zur Frage im OP:
auto itr = mTextureMap.insert(std::make_pair(id, std::move(texture)));Was du bekommst, ist ein
std::pair<iterator, bool>. Der Iterator hat aber nicht den Wert vonend(), wenn nichts eingefügt wurde - sondern er zeigt auf das Element mit dem bereits vorhandenen Key.Um also zu prüfen, ob der Einfügevorgang erfolgreich war, schreibst du
auto pair = mTextureMap.insert({id, std::move(texture)}); // ungetestet if( pair.second ) ...