std::unordered_map::emplace和std::unordered_map::insertC++有什么区别?
简单的方法是显而易见的
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),而且由于我正在处理个人项目,我可以负担得起它.
这是我的代码:
class Base
{
public:
virtual void show() const = 0;
};
class Child : public Base
{
private:
static const int i = 1;
public:
virtual void show() const
{
cout << i;
}
};
map<int, const Base &> myMap{
{ 0, Child() },
{ 1, Child() },
};
Base & b = Child();
int main()
{
b.show();
myMap.at(0).show(); // This provokes the error
system("pause>NUL");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在尝试使用global(或static)数据,这将调用某些virtual函数.当我在测试Base & b = …