【问题标题】:C++: What is the proper way to remove elements from a vector of object pointers without deleting the object it points to?C ++:从对象指针向量中删除元素而不删除它指向的对象的正确方法是什么?
【发布时间】:2016-12-10 09:05:47
【问题描述】:

从对象指针向量中删除元素而不删除它指向的对象的正确方法是什么?

我正在尝试有选择地从我的向量中删除元素

std::vector<Node*>openNodes;

不破坏任何指向的节点对象。 (这些节点正在其他地方使用。)

我尝试像这样使用 的 remove_if 函数

std::remove_if(openNodes.begin(),openNodes.end(),CheckClosedNode);

使用我自己的自定义比较器函数

bool CheckClosedNode(Node *tocheck)
{
    if(tocheck->isOpen)
        return false; //Don't remove. Node is still open.
    else
    {
        //std::cout << "node " << tocheck->id << " is being removed from open list..." << std::endl;
        return true; // Remove. Node is closed.
    }
}

但是,当我 std::cout openNodes 的内容时,没有任何内容被删除。我读到我应该将 std::erase() 与 remove_if() 结合使用,但 erase() 会删除节点。我想将所有需要删除的元素移到向量的前面并执行 pop_front(),但结果 pop_front 也删除了。

是否有一种标准方法可以在不删除对象的情况下从向量中删除元素?

【问题讨论】:

  • 您误解了有关 std::vector::erase 的文档。它会破坏已删除的元素(在您的情况下是指针)而不是它们指向的元素。

标签: c++ vector


【解决方案1】:

如果它们是指针,它实际上不会删除节点。当您使用 new 为对象分配内存时,您的工作就是删除指针。现在,如果您将其声明为vector&lt;Node&gt;,这将是一个问题,因为擦除必须在 Node.js 上调用解构器。然而,指针真的很像 int 类型(因为它只是一个内存地址)。当您从向量中删除它时,它指向的内存不会发生任何变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 2014-04-28
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2023-03-26
    • 2013-09-09
    • 2011-06-10
    相关资源
    最近更新 更多