从 std::set> 中删除由 T*
我有一组共享指针:
std::set<boost::shared_ptr<T>> set;
和一个指针:
T* p;
我想有效删除set
中等于p
的元素,但我可以不要对 set 的任何成员或任何标准算法执行此操作,因为 T*
与 boost::shared_ptr
是完全不同的类型。
我能想到的几种方法是:
- 以某种方式从指针构造一个新的shared_ptr,该指针不会获取指向内存的所有权(理想的解决方案,但我不知道如何做到这一点)
- 包装/重新实现shared_ptr,以便 可以完成上述操作
- 我只需在集合上进行我自己的二分搜索就
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用
null_deleter
从T
构造一个shared_ptr
(参见 boost:::shared_ptr 常见问题解答)。这样,类型是兼容的,您不必担心临时共享指针删除任何对象。
或者,正如其中一条评论所说,如果您可以将 T 更改为从 enable_shared_from_this 你可以从你的对象获得正确的共享指针。
Construct a
shared_ptr<T>
fromT
with anull_deleter
(see boost:::shared_ptr FAQ).That way the types are compatible and you don't have to worry about your temporary shared_ptr deleting any object.
Or, as one of the comments say, if you can change T to inherit from enable_shared_from_this you could get a correct shared ptr from your object.
如果使用集合的原因是需要高效地查找类型 T 的指针,那么显而易见的答案就是不要将其设为共享指针集合!相反,将集合包装在一个类中,该类管理集合包含的指针的生命周期。
If the reason for using the set is that you need to efficiently find pointers of type T, then the obvious answer is not to make it a set of shared pointers! Instead, wrap the set in a class which manages the lifetimes of the pointers that the set contains.
您可以使用
boost::ptr_set
如果您希望集合拥有对象的所有权,或者
boost::reference_wrapper
如果您只想让集合存储对它们的引用。如果您在代码中的一个位置使用shared_ptr
,则必须在所有位置使用它,否则将面临严重崩溃的风险(悬空指针、已删除的对象等)。例外是weak_ptr
,指向由shared_ptr
持有的对象的指针,但不共享所有权。You can use
boost::ptr_set
if you want the set to have ownership of the objects, orboost::reference_wrapper
if you just want the set to store references to them. If you useshared_ptr
in one place in your code, you will have to use it in all places, or risk terrible crashes (dangling pointers, already deleted objects etc.). The exception isweak_ptr
, a pointer that points to an object held by ashared_ptr
but does not share ownership.