我有一组共享指针:
std::set<boost::shared_ptr<T>> set;
还有一个指针:
T* p;
我想高效删除set
的元素等于 p
,但我不能对集合的任何成员或任何标准算法执行此操作,因为 T*
是与 boost::shared_ptr<T>
完全不同的类型.
我能想到的几种方法是:
- 以某种方式从指针构造一个新的 shared_ptr,该指针不会取得指向内存的所有权(理想的解决方案,但我看不出如何做到这一点)
- 包装/重新实现 shared_ptr 以便我可以执行上述操作
- 只是在集合上做我自己的二分查找
最佳答案
构造一个 shared_ptr<T>
来自 T
用null_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/