我有一个无序的 map 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();

或者是其他东西 ?

最佳答案

最好的方法是让 map 包含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();

10-08 03:54