我有两个问题。首先我有一个std::unordered_map<int,Object*>
其中对象如下所示:
// Object.hpp
class Object {
public:
Object();
~Object(){};
int Id();
void setId(int i);
private:
int id;
};
这个unordered_map
被放入一个名为 DataSet
的类中它用作容纳所有这些对象的容器。在 DataSet
我希望能够正确删除给定整数 id
的键/值对来自对象。
为此,我尝试创建一个迭代器,通过 id 查找键,然后删除指向迭代器的指针,最后删除键/值对。它看起来像这样:
int DataSet::deleteObject(int id)
{
std::unordered_map<int,Object*>::iterator found_it = objects.find(id);
if(found_it != objects.end()) {
delete *found_it;
objects.erase(found_it);
}
return 1;
}
但是,当我编译它时,我收到此错误:
dataset.cpp:44:9: error: cannot delete expression of type 'value_type'
(aka 'pair<key_type, mapped_type>')
delete *found_it;
有没有正确的方法来删除 Object
在那个位置?
第二,写clear()
时方法,我意识到我不能只做 objects.clear()
,所以我想知道是否有办法真正清除 unordered_map
.
例如,当我使用std::vector
时我能够做到这一点:
std::vector<Object *>::reverse_iterator object;
for(object = objects.rbegin(); object < objects.rend(); object++)
delete(*object);
objects.clear();
但是现在这对于 unordered_map
不起作用,那么正确的方法是什么?我所面临的要求使得我无法更改 Object
,或者如何 unordered_map
已设置。
最佳答案
问题的第一部分非常简单:迭代器引用值和类型为 std::pair<int const, Object*>
的给定位置。 。你不能delete
这样一个物体。您将使用 second
获取指针对象的一部分,例如:
delete found_it->second;
然而,这种维护实际上并不常见,而且很容易出错。你最好不要存储 Object*
而是一个std::unique_ptr<Object>
:std::unique_ptr<Object>
销毁时会自动释放该对象。这也将简化删除元素的过程:
int DataSet::deletObject(int id) {
return objects.erase(id);
}
存储时std::unique_ptr<Object>
不过,在将元素插入容器时,您可能需要更详细一些,例如:
objects.insert(std::make_pair(key, std::unique_ptr<Object>(ptr)));
鉴于您的 Object
类没有任何虚函数,您可能只存储 Object
不过,直接:
std::unordered_map<int, Object> objects;
关于c++ - 从 unordered_map C++ 中删除键/值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29178127/