我正在尝试在我的程序中使用以下数据集合:
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减速?我是否需要创建一个使用实体作为哈希的哈希函数?
答案 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传递给其他类,而这些类又使用一些容器来存储这些类。结果,这段代码以记忆泄漏的形式在测试者的脸上幸运地爆炸了。
我希望你能弄明白为什么。