使用带有shared_ptr键的无序集
Using an unordered_set with shared_ptr keys
我正试图在我的程序中使用以下数据收集:
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。结果,幸运的是,这段代码以内存泄漏的形式出现在测试人员的脸上。
我希望你能弄清楚原因。
- 递归无序映射
- CLANG 编译器 说:变量"PTR"可能未初始化
- c++找不到具有相同哈希的无序集合元素
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 如何使用set实现无序数据结构?
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 如何禁用 CPU 的无序执行
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 从C++无序集合中高效提取元素
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 打印无序映射的第二个元素,即集合
- 引用 std::shared:ptr 以避免引用计数
- 当我将其插入无序地图时,矢量的容量为 0
- std::哈希表示无序映射中的唯一 PTR
- 插入无序映射将共享ptr变为null