Легкий путь очевиден
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)});
Однако это выглядит не слишком эффективно, так как мне приходится дважды искать ключ на карте. Один, чтобы проверить, не существует ли ключ, и функция вставки также сделает то же самое.
Если я просто использую mymap.insert({5, std::move(myptr)});
, то мой уникальный ptr (myptr) исчезнет, если pair.second
вернет false (ключ уже существует).
РЕДАКТИРОВАТЬ:
По-видимому, ответ на С++ 17 с try_emplace
, и он уже доступен в компиляторе, который я использую (vs2015), и, поскольку я работаю над личным проектом, я могу позволить себе его использовать.
std::map::find
, возможно, вы используете не тот контейнер?std::unordered_map
находится поверх хеш-таблицы, поэтому некоторые операции амортизируются за O(1) вместо O(log n) — поиск включен. - person Conduit   schedule 10.06.2016try_emplace
. - person NathanOliver   schedule 10.06.2016