繁体   English   中英

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

[英]C++: What is the proper way to remove elements from a vector of object pointers without deleting the object it points to?

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

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

std::vector<Node*>openNodes;

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

我尝试像这样使用<算法>的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()结合使用,但是delete()将删除节点。 我想到将所有需要删除的元素移到向量的前面,并执行pop_front(),但事实证明pop_front也会删除。

是否有一种标准方法可以从向量中删除元素而不删除对象?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM