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

时间:2016-08-04 09:49:27

标签: c++ vector

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

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

std::vector<Node*>openNodes;

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

我尝试过使用&lt;算法&gt;的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()将删除节点。我想把所有需要删除的元素移到vector的前面并执行pop_front(),但结果是pop_front也删除了。

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

1 个答案:

答案 0 :(得分:4)

如果它们是指针,它实际上不会删除节点。使用new为对象分配内存时,删除指针是你的工作。现在,如果您已将其声明为vector<Node>,那么这将是一个问题,因为擦除必须在Node上调用解构函数。但是,指针实际上就像一个int类型(因为它只是一个内存地址)。当你从矢量中删除它时,它指向的内存没有任何反应。