Najłatwiej obviosulyskuteczny sposób, aby wstawić unique_ptr do mapy bez usuwania wskaźnik jeśli klucz już istnieje
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)});
Jednak to nie wygląda zbyt wydajny, jak mam znaleźć klucz na mapie dwukrotnie. Jeden, aby sprawdzić, czy klucz nie istnieje, a funkcja wstawiania również zrobi to samo.
Jeśli po prostu użyję mymap.insert({5, std::move(myptr)});
, mój unikalny ptr (myptr) zniknie, jeśli pair.second
zwróci wartość false (klucz już istnieje).
EDIT:
Najwyraźniej odpowiedź jest na C++ 17, z try_emplace
, i to jest już dostępny w kompilator używam (vs2015), a ponieważ pracuję nad osobistym projektem, mogę pozwolić sobie na jego użycie.
Dlaczego mówisz, że nie wygląda wydajny? Wygląda dobrze dla mnie. –
Jeśli martwisz się złożonością 'std :: map :: find', to może używasz niewłaściwego kontenera? 'std :: unordered_map' znajduje się na szczycie tablicy, co powoduje, że niektóre operacje O (1) są zamieniane zamiast O (log n) - znalezione znalezisko. – Conduit
Wygląda prawie tak, jakbyś chciał wejść w następnym standardzie ['try_emplace'] (http://en.cppreference.com/w/cpp/container/map/try_emplace) – NathanOliver