从矢量或地图中删除共享指针

removing shared pointers from vector or map

我目前正在学习智能指针,尽量避免使用裸指针。

我有一个带有共享点的向量

std::vector<std::shared_ptr<View>> mChildren;

以及添加和删除方法

void View::AddChild(std::shared_ptr<View> view) {
    mChildren.push_back(view);
}

void View::RemoveChild(std::shared_ptr<View> view) {
    auto removal = std::remove(mChildren.begin(), mChildren.end(), view);
    mChildren.erase(removal, mChildren.end());
}

现在在我的代码的另一部分我有一张地图

std::map<std::weak_ptr<ModelGem>,std::unique_ptr<ViewGem>,std::owner_less<std::weak_ptr<ModelGem>>> mViews;

现在,当我尝试像这样从地图中删除元素时:

for (auto iterator = mViews.begin(); iterator != mViews.end();) 
{
    if (iterator->first.expired()) 
    {
        RemoveChild(iterator->second.get());
        iterator = mViews.erase(iterator);
    }
    else 
    {
        iterator++;
    }
}

现在问题出在这里:iterator->second.get() 它告诉我它不能将类型指针的右值转换为共享指针。 但是,如果我使用原始指针而不是共享指针,这根本不是问题。

所以,我想知道在这种情况下是只使用原始指针更好还是我可以使用共享指针解决这个问题?

So, I am wondering if in this case it would be better to just use raw pointers or can I work around this with shared pointers?

在大多数情况下,只有一种右指针类型可以使用。并不是说一个比另一个好。正确的方法只有一种。

地图上有 unique_ptr<ViewGem>。这意味着它拥有完全的所有权并且不与任何其他数据结构共享。因此,不可能在 vector<shared_ptr...> 中拥有相同的对象而不导致未定义的行为。你必须决定哪个 ds 拥有所有权,

  1. 如果地图拥有完全所有权,在地图中使用unique_ptr,在向量中使用原始指针
  2. 如果 vector 有所有权,在 vector 中使用 unique_ptr,在 map 中使用 raw ptr。
  3. 如果所有权类似于 ds 都拥有,并且只有当对象从 map 和 vector 中删除时才应销毁对象,则在两者中都使用 shared_ptr