在unordered_map中添加新对象的最佳方法

C++ Best way to add new object in unordered_map

本文关键字:对象 方法 最佳 新对象 unordered map 添加      更新时间:2023-10-16

我有一个无序映射std::unordered_map<unsigned int, MyObject*> myDictionary

当我想添加一个条目时,我首先要检查键是否已经存在。如果是,我需要访问我的对象来调用函数。

如果键不存在,我想用这个键创建一个新的MyObject。

这样比较好吗?

MyObject *my_obj;
try
{
   my_obj = myDictionary.at(key);
}
catch (int e)
{
   my_obj = new MyObject();
   myDictionary[key] = my_obj;
}
my_obj->Function();

还是这个?

MyObject *my_obj;
if(myDictionary.find(key) == myDictionary->end())
{
   my_obj = new MyObject();
   myDictionary[key] = my_obj;
}
else
{
   my_obj = myDictionary[key];
}
my_obj->Function();

最好的方法是让地图包含MyObject而不是MyObject *

std::unordered_map<unsigned int, MyObject> myDictionary;

使用

myDictionary[key].Function();  // if key doesn't exist, it'll be inserted for you

假设您必须使用MyObject *,请使用unique_ptr来保存它们,而不是使用原始指针。

std::unordered_map<unsigned int, std::unique_ptr<MyObject>> myDictionary;
unsigned key = 42;
if(myDictionary.find(key) == myDictionary.end()) {
    myDictionary.insert(std::make_pair(key, std::unique_ptr<MyObject>(new MyObject())));
}
myDictionary[key]->Function();

在你的情况下,我会这样做:

MyObject*& my_obj= myDictionary[key];
if (my_obj==nullptr)
  my_obj= new MyObject;
my_obj->Function();

通过这种方式,可以将其他方法在插入时所做的双重查找(一次用于查找,一次用于插入)保存到映射中。

正如其他人所说,尽管这与你的问题无关,但请使用智能指针:

// Using a std::unordered_map<unsigned int, std::unique_ptr<MyObject>>
std::unique_ptr<MyObject>& my_obj= myDictionary[key];
if (my_obj==nullptr)
  my_obj.reset(new MyObject);
my_obj->Function();