Die einfache Lösung existiert, ist obviosulyeffiziente Art und Weise eine unique_ptr in eine Karte einfügen, ohne den Zeiger zu löschen, wenn der Schlüssel bereits
std::map<int,std::unique_ptr<something>> mymap;
auto f = mymap.find(5);
std::unique_ptr<something> myptr;
if (f == mymap.end())
mymap.insert({5, std::move(myptr)});
Dies ist jedoch nicht zu effizient sieht, wie ich den Schlüssel zu finden, in der Karte zweimal. Ein, um zu überprüfen, ob der Schlüssel nicht existiert, und die Einfügefunktion wird das gleiche tun.
Wenn ich einfach mymap.insert({5, std::move(myptr)});
verwende, dann ist mein eindeutiges ptr (myptr) weg, wenn pair.second
false zurückgibt (Schlüssel existiert bereits).
EDIT:
Anscheinend ist die Antwort auf C 17 ++, mit try_emplace
, und es ist bereits in dem Compiler Ich verwende (vs2015) und da ich an einem persönlichen Projekt gerade arbeite, kann ich leisten, es zu benutzen.
Warum sagen Sie es nicht effizient aus? Sieht gut aus für mich. –
Wenn Sie sich Sorgen machen über die Komplexität von 'std :: map :: find', dann verwenden Sie vielleicht den falschen Container? 'std :: unordered_map' sitzt auf einer Hashtabelle, wodurch einige Operationen O (1) amortisiert statt O (log n) werden - find included. – Conduit
Sieht so aus, als ob Sie das nächste im nächsten Standard haben möchten ['try_emplace'] (http://en.cppreference.com/w/cpp/container/map/try_emplace) – NathanOliver