使用带有shared_ptr键的无序集

Using an unordered_set with shared_ptr keys

本文关键字:无序 ptr shared      更新时间:2023-10-16

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

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是shared_ptr的副本,如果我调用removeEntity(),我将尝试使用该副本从unordered.set中删除实体。

我需要为无序集做些什么才能找到实体?我需要创建一个比较函数来检查shared_ptr的值吗?但是,由于其哈希函数使用shared_ptr作为哈希,unrdered_set不会放慢速度吗?我是否需要创建一个散列函数,同时使用实体作为散列?

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

boost::unordered_set使用boost::hash模板函数为boost::unordered_set生成密钥。此函数专门用于boost::shared_ptr,以将底层指针考虑在内。

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

boost::sharedptr是使用引用计数机制实现的。这意味着,每当你把它传递给其他函数时,你只是在增加引用计数,而当你删除它时,你是在减少它的引用计数。当引用计数为0时,则仅从内存中删除该对象。

使用它时一定要小心。只有在你的设计能够适应内存泄漏的情况下,它才能使你免于内存泄漏。

例如,我面临一个问题。

我想要一个带有包含shared_ptrs的映射的类。后来,这个类(在我不知情的情况下)还负责将这些共享ptr传递给其他一些类,这些类又使用一些容器来存储这些ptr。结果,幸运的是,这段代码以内存泄漏的形式出现在测试人员的脸上。

我希望你能弄清楚原因。