如果密钥已存在,则将unique_ptr插入到地图中而不删除指针的有效方法

Gam*_*Gam 8 c++ c++17

简单的方法是显而易见的

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)});
Run Code Online (Sandbox Code Playgroud)

但是,这看起来效率不高,因为我必须在地图中找到两次键.一个用于检查密钥是否不存在,并且插入功能也将执行相同的操作.

如果我只是使用mymap.insert({5, std::move(myptr)});那么我的唯一ptr(myptr)如果pair.second返回false(键已经存在)就消失了.

编辑:

显然答案是在C++ 17上try_emplace,并且它已经在我正在使用的编译器中可用(vs2015),而且由于我正在处理个人项目,我可以负担得起它.

Leo*_*eon 5

如果您不打算nullptr在地图中存储s,那么您可以这样做:

auto& r = mymap[5];
if ( r == nullptr )
    r = std::move(myptr);
Run Code Online (Sandbox Code Playgroud)