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

标签 c++ find unordered-map

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

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

如果键不存在,我想用这个键创建一个新的 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();

关于C++ 在 unordered_map 中添加新对象的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328709/

相关文章:

c++ - C c;之间有什么区别吗?和 C c = C();?

c++ - C++ 标准中的哪一段验证了以下示例中使用的表达式 `sizeof(S::m + 42)`?

design-patterns - Bash - 如何查找和删除包含给定字符串的所有文件?

c++ - 用户定义的无序映射哈希函数

c++ - 用 unordered_map 制作树

c++ - 如何将键但没有值插入 std::unordered_map

c++ - 为什么这些成员没有被默认初始化?

c++ - C++ 中的指针、释放和 vector

Linux 查找未命中目标?

linux - 文件搜索 bash 脚本