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

时间:2014-06-20 13:42:16

标签: c++ find unordered-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();

还是其他什么?

2 个答案:

答案 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();