如何擦除包含指向结构的指针的列表的对象?

How to erase an object of a list containing pointers to a struct?

我有一个名为 Node 的结构,它有 3 个成员,其中一个充当对象的 ID:

struct Node {
  string mem1;
  string mem2;
  int id;
}

以及包含指向 Node 对象的指针的列表:

list<Node*> g_node;

当试图从该列表中删除特定对象时出现问题(由 id 本地化)。我有此代码但不起作用:

list<Node>::iterator it = g_node.begin();
            while (it != g_node.end()){
                if (it->id == iden)
                {
                    g_node->erase(it);
                }
            }
        } else if (iden != 0) {

"iden"为待删除对象的id,由用户输入。

怎么了?

为什么不使用 std::list::remove_if

g_node.remove_if([iden](const Node *n){return n->id == iden;});

请注意,这不会 delete Node 对象(您的原始代码也不会)。对于保存指针的容器,您可能需要考虑智能指针。

remove_if 是个好主意,但如果你想拥有一个可以轻松重用和随意自定义的功能,你可以这样做:

bool remove_from_list(int id, list<Node*> &g_node)
{
    auto it = g_node.begin();

    while (it != g_node.end())
    {
        if ((*it)->id == id)
        {
            // free memory... if you allocated those pointers
            delete (*it); 
            g_node.erase(it);
            return true;
        }
        else
            it++;
    }

    return false;
}

list<Node*> g_node;
g_node.push_back(new Node { "a", "b", 5 });
g_node.push_back(new Node { "ee", "77", 6 });
remove_from_list(5, g_node);