c++ - 通过 T* 从 std::set<shared_ptr<T>> 移除

标签 c++ boost smart-pointers

我有一组共享指针:

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

还有一个指针:

T* p;

我想高效删除set的元素等于 p ,但我不能对集合的任何成员或任何标准算法执行此操作,因为 T*是与 boost::shared_ptr<T> 完全不同的类型.

我能想到的几种方法是:

  • 以某种方式从指针构造一个新的 shared_ptr,该指针不会取得指向内存的所有权(理想的解决方案,但我看不出如何做到这一点)
  • 包装/重新实现 shared_ptr 以便我可以执行上述操作
  • 只是在集合上做我自己的二分查找

最佳答案

构造一个 shared_ptr<T>来自 Tnull_deleter (参见 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);
}

这样类型是兼容的,您不必担心您的临时 shared_ptr 会删除任何对象。

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

关于c++ - 通过 T* 从 std::set<shared_ptr<T>> 移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2532625/

相关文章:

c++ - 如何使用 C++ 按第一个、第二个、第三个...列对二维数组进行排序?

c++ - 使用 std::unique_ptr 创建对象数组

c++ - std::set 和 boost::ptr_set 之间的区别?

c++ - Windows 事件的等效 boost

c++ - 为什么 std::sub_match<T> 公开继承自 std::pair<T, T>?

c++ - 如何在 C++ 中返回 unique_ptr 列表?

c++ - 如何在必须复制构造的类中使用 std::auto_ptr?

c++ - 向后搜索时 libvlc_media_player_set_position 失败

c++ - 捕获不可见线程的未处理异常

c++ - std::wstring 和 LOGFONT 重载冲突 - 为什么?