从 std::set> 中删除由 T*

发布于 2024-08-27 01:13:21 字数 467 浏览 9 评论 0 原文

我有一组共享指针:

std::set<boost::shared_ptr<T>> set;

和一个指针:

T* p;

我想有效删除set中等于p的元素,但我可以不要对 set 的任何成员或任何标准算法执行此操作,因为 T*boost::shared_ptr 是完全不同的类型。

我能想到的几种方法是:

  • 以某种方式从指针构造一个新的shared_ptr,该指针不会获取指向内存的所有权(理想的解决方案,但我不知道如何做到这一点)
  • 包装/重新实现shared_ptr,以便 可以完成上述操作
  • 我只需在集合上进行我自己的二分搜索就

I have a set of shared pointers:

std::set<boost::shared_ptr<T>> set;

And a pointer:

T* p;

I would like to efficiently remove the element of set equal to p, but I can't do this with any of the members of set, or any of the standard algorithms, since T* is a completely different type to boost::shared_ptr<T>.

A few approaches I can think of are:

  • somehow constructing a new shared_ptr from the pointer that won't take ownership of the pointed to memory (ideal solution, but I can't see how to do this)
  • wrapping / re-implementing shared_ptr so that I can do the above
  • just doing my own binary search over the set

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小草泠泠 2024-09-03 01:13:21

使用 null_deleterT 构造一个 shared_ptr (参见 boost:::shared_ptr 常见问题解答)。

struct null_deleter {
    void operator()(void const *) const { }
};

size_t remove_ptr_from_set(std::set<boost::shared_ptr<T>> &set, X* x)
{
    shared_ptr<X> px(x, null_deleter());
    return set.erase(px);
}

这样,类型是兼容的,您不必担心临时共享指针删除任何对象。

或者,正如其中一条评论所说,如果您可以将 T 更改为从 enable_shared_from_this 你可以从你的对象获得正确的共享指针。

Construct a shared_ptr<T> from T with a null_deleter (see boost:::shared_ptr FAQ).

struct null_deleter {
    void operator()(void const *) const { }
};

size_t remove_ptr_from_set(std::set<boost::shared_ptr<T>> &set, X* x)
{
    shared_ptr<X> px(x, null_deleter());
    return set.erase(px);
}

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.

|煩躁 2024-09-03 01:13:21

如果使用集合的原因是需要高效地查找类型 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.

木格 2024-09-03 01:13:21

您可以使用 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, or boost::reference_wrapper if you just want the set to store references to them. If you use shared_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 is weak_ptr, a pointer that points to an object held by a shared_ptr but does not share ownership.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文