在unordered_map中添加新对象的最佳方法
C++ Best way to add new object in 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();
最好的方法是让地图包含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();
在你的情况下,我会这样做:
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();
相关文章:
- 使用std::函数映射对象方法
- 正在调用shared_ptr对象方法
- 检查哪个对象调用了另一个对象的对象方法
- 如何在C++中循环访问未知对象方法?
- c++ 替换调用对象方法的宏函数
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 我可以制作一个对象方法,如果单独调用,它将自行修改,但如果在复制初始化期间调用,则会返回一个新对象?
- 如何让两个不同的对象方法相互用作参数
- 在创建 c++ 期间调用对象方法
- 扩展中的日期时间对象方法C++问题
- 将对象方法从向量应用于C 的第二个向量中的对象
- 将 C++/CLI 对象指针传递给本机对象方法
- 多态性的面向对象方法
- 将对象方法传递到变量
- C :使用Main中定义的对象方法的函数
- 有关使用矢量迭代器访问对象方法的问题
- 定义可以执行对象方法和独立函数的函数时出现问题
- 调用列表中子对象方法的最佳方法
- main.cpp:(.text+0x8f):对[对象方法]的未定义引用
- cpp 从需要超类对象的函数访问子类对象方法