c++ - 从 unordered_map C++ 中删除键/值对

标签 c++ pointers c++11 dictionary

我有两个问题。首先我有一个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/

相关文章:

c++ - 检查字符串的长度

c++ - "use of class template requires template argument list"是什么意思?

c++ - 删除多维数组

pointers - 为什么 http.Client{} 的前缀是 &?

c - 在 C 编程中,如何将 char * 转换为 int,然后再转换回 char *?

c - 使用指向指针的指针初始化 C 结构

c++ - 使用类内成员初始化器进行结构初始化

c++ - std::emplace_back 调用 vector 中其他对象的构造函数?

c++ - LLVM 有后端优化器吗?

c++ - 递归函数周围的 lambda 包装器中的 this-pointer 捕获