使用带有shared_ptr键的unordered_set

时间:2014-09-17 14:05:07

标签: c++ boost shared-ptr unordered-set

我正在尝试在我的程序中使用以下数据集合:

boost::unordered_set<boost::shared_ptr<Entity> > _entities;

我正在使用unordered_set,因为我想要快速插入和删除(通过键,而不是迭代器)实体。

我怀疑的是,如果我实现以下两个功能:

void addEntity(boost::shared_ptr<Entity> entity) {
    _entities.insert(entity);
}
void removeEntity(boost::shared_ptr<Entity> entity) {
    _entities.remove(entity);
}

当我尝试删除实体时,unordered_set会找到它吗?因为存储在unordered_set中的shared_ptr是我试图用来从unordered_set中删除实体的shared_ptr的副本,如果我调用removeEntity()。

我需要为unordered_set找到实体做些什么?我是否需要创建一个比较函数来检查shared_ptr的值?但是,由于其散列函数使用shared_ptr作为散列,因此无法使unordered_set减速?我是否需要创建一个使用实体作为哈希的哈希函数?

2 个答案:

答案 0 :(得分:7)

是的,您可以在boost::shared_ptr中使用boost::unordered_set(同样适用于这些类的标准版本)

boost::unordered_set使用boost::hash模板功能为boost::unordered_set生成密钥。此函数专门用于boost::shared_ptr以考虑基础指针。

答案 1 :(得分:-1)

如果我做对了,让我试着解释一下: -

boost :: shared_ptr使用引用计数机制实现。这意味着无论何时将它传递给其他一些let函数,你只是增加引用计数,而当你删除它时,你正在减少它的引用计数。当引用计数为0时,只从该内存中删除该对象。

使用时务必小心。只要您的设计能够容纳它们,它就可以避免内存泄漏。

例如,我遇到了一个问题。

我是一个包含shared_ptrs的地图的类。后来这个类(在我不知情的情况下)也负责将这些共享ptrs传递给其他类,而这些类又使用一些容器来存储这些类。结果,这段代码以记忆泄漏的形式在测试者的脸上幸运地爆炸了。

我希望你能弄明白为什么。