我有一张无序的地图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();
还是其他什么?
答案 0 :(得分:2)
最好的方法是让地图包含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();
答案 1 :(得分:2)
在你的情况下,我会这样做:
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();