Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何删除包含指向结构的指针的列表的对象?_C++_List_Struct_Erase - Fatal编程技术网

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

C++ 如何删除包含指向结构的指针的列表的对象?,c++,list,struct,erase,C++,List,Struct,Erase,我有一个名为Node的结构,有3个成员,其中一个成员充当对象的id: struct节点{ 字符串mem1; 字符串mem2; int-id; } 以及包含指向节点对象的指针的列表: 列表g_节点; 当试图从该列表中删除特定对象(通过id进行本地化)时,会出现问题。我有此代码,但不起作用: list::iterator it=g_node.begin(); while(it!=g_node.end()){ if(it->id==iden) { g_节点->擦除(它); } } }否则如果(id

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

struct节点{
字符串mem1;
字符串mem2;
int-id;
}
以及包含指向节点对象的指针的列表:

列表g_节点;
当试图从该列表中删除特定对象(通过id进行本地化)时,会出现问题。我有此代码,但不起作用:

list::iterator it=g_node.begin();
while(it!=g_node.end()){
if(it->id==iden)
{
g_节点->擦除(它);
}
}
}否则如果(iden!=0){
“iden”是要删除的对象的id,由用户输入

怎么了?

为什么不使用


注意,这将不会<代码>删除<代码> <代码>节点< /code >对象(既不包含原始代码)。在容器持有指针的情况下,您可能需要考虑智能指针。

为什么不使用?



注意,这将不会<代码>删除<代码> <代码>节点< /code >对象(既不包含原始代码)。容器持有指针时,您可能需要考虑智能指针。

RevEvIIF是一个好主意,但是如果您想拥有一个可以轻松重用和自定义的函数,您可以这样做:

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);
bool从\u列表中删除\u(int-id,list&g\u节点)
{
auto it=g_node.begin();
while(it!=g_node.end())
{
if((*it)->id==id)
{
//释放内存…如果您分配了这些指针
删除(*它);
g_节点。擦除(it);
返回true;
}
其他的
it++;
}
返回false;
}
列表g_节点;
g_节点。向后推_(新节点{“a”,“b”,5});
g_节点。推回(新节点{“ee”,“77”,6});
从_列表中删除_(5,g_节点);

删除\u 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);
bool从\u列表中删除\u(int-id,list&g\u节点)
{
auto it=g_node.begin();
while(it!=g_node.end())
{
if((*it)->id==id)
{
//释放内存…如果您分配了这些指针
删除(*它);
g_节点。擦除(it);
返回true;
}
其他的
it++;
}
返回false;
}
列表g_节点;
g_节点。向后推_(新节点{“a”,“b”,5});
g_节点。推回(新节点{“ee”,“77”,6});
从_列表中删除_(5,g_节点);

为什么这个标记为C?您是否忘记了
++it
?同样,在
列表中是否只有一个
id
iden
相同的条目?如果是,您可以
在成功擦除时中断
循环。如果不是,您应该使用擦除-删除习惯用法。在容器上迭代并擦除元素时,使用返回的ierase的terator(!)作为下一个有效迭代器(erase可能会使传递给erase的迭代器无效)
g_节点->erase(它)如果不需要插入命令,请考虑使用<代码> STD::MAP< /COD>或 STD::MultIMAP 为什么这个标记的C?你忘记了“代码> ++IT < /代码>吗?还有,在<代码>列表<代码>中只有一个条目有<代码> ID 
iden
相同?如果是,您可以
在成功擦除时中断
循环。如果不是,您应该使用erase-remove习惯用法。在容器上迭代并擦除元素时,使用erase返回的迭代器(!)作为下一个有效迭代器(erase可能会使传递给erase的迭代器无效)
g_节点->erase(它)“< /代码>编译失败,没有<代码>运算符> <代码>定义为<代码> STD::清单< /代码>。如果不需要插入命令,请考虑使用<代码> STD::MAP< /COD>或 STD::MultIMAP 因为我的代码是这样做的,我想也许他也这么做了,可能忘了释放它。这就是为什么我用新的方式写下我的答案的原因。还有delete(我实际上正在考虑在没有delete部分的情况下给出我的答案…但我认为这是愚蠢的)这是一个很大的假设。也许最好请OP澄清一下。我的评论太长了,不容易阅读。它现在变小了。“//释放内存…如果你分配了那些指针”这应该足够了。因为我的代码有,我想他的代码也有,而且可能忘了释放它。这就是为什么我用new和delete来写我的答案(我实际上在考虑不使用delete部分给出我的答案…但我认为这很愚蠢)这是一个很大的假设。也许最好请OP澄清一下。我的评论太长了,不容易阅读。现在它变小了。“//释放内存…如果你分配了那些指针”这应该足够了。读者注意:
list::remove_if
std::remove_if
具有不同的语义:后者移动元素而不删除它们,但是
list
版本实际上会删除它们。读者注意:
list::remove_if
std::remove_if
具有不同的语义:后者ves元素没有擦除它们,但是
列表
版本实际上会擦除它们。