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