c++ - 带有标准容器的 std::shared_ptr

标签 c++ stl map set shared-ptr

我有一个容器 shared_ptr s 和我将这些对象交给 Windows API,稍后我使用原始 ptr 获得回调。我要找对shared_ptr事后。这可以用 shared_ptr 干净地完成吗? (不使用 shared_from_this() )。

非常基本的例子:

class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
  m_gSet.erase(pRawPtr);
}

我知道这可以用 intrusive_ptr 来完成很容易,但我很好奇是否有办法使用 shared_ptr .也就是我正在寻找容器来接受 RawPtr 和用于定位 shared_ptr 的 shared_ptr。元素。问题是我不能隐式地转换 CFoo*进入 shared_ptr (出于我理解的原因)。

我以为我可以做

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

但我还没有尝试过,它看起来很危险/丑陋。还有其他方法还是我基本上是在寻找intrusive_ptr ?谢谢

最佳答案

为什么不是显而易见的方式?遍历容器,

if(iterator->get() == rawPointer)
   container.erase(iterator)

编辑:要利用 O(logN) 查找,您可以做您想做的事(即创建一个带有 no_op 删除器的 shared_ptr)。它可能很难看,但并不危险

关于c++ - 带有标准容器的 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236232/

相关文章:

c++ - C++/MFC 中枚举网络共享目录

c++ - Flatbuffers 验证器行为

c++ - 查找操作的时间复杂度

c++ - 我应该如何为小于标准的 std::mersenne_twister_engine 选择参数?

java - 查找 map 中每个键的平均对象字段

c++ - 在类中重载 << 运算符

c++ - 给出错误答案的简单 C++ 代码

c++ - 如何更改 C++ 标准库中堆中的最大元素?

c++ - 令人困惑的 std::map 插入行为

java - 如何在达到限制时通过删除最旧的条目来限制 map 的最大大小