从结构类型列表中擦除元素

Erase element from list of type struct

本文关键字:擦除 元素 列表 结构 类型      更新时间:2023-10-16

这是我的列表的声明:list<Message*> g_messages;

其中Messagestruct.

我想删除列表的某个位置(消息)。如果它是一个向量,我会这样做:

//delete g_messages[id];

必须使用列表 .erase(),但我不知道如何使用。

g_messages.erase(id);不起作用。建议使用迭代器,但是如何链接const int id和迭代器?

这就是你对列表的处理方式,你必须遍历所有列表,因为它们是双向链表(每个元素都包含一个指向上一个和下一个元素的指针)。

// loop through all the elements
for (auto& it = g_messages.begin(); it != g_messages.end(); it++)
{
    if ((*it)->id == input_id)
    {
        delete *it;
        g_messages.erase(it);
        break;
    }
}

另一种选择是使用 std::find_if 从 <algorithm> 中获取谓词

auto it = std::find_if(g_messages.begin(), g_messages.end(), [input_id](Message* p){ return (p->id == input_id); });
if (it != g_messages.end())
{
    delete *it;
    g_messages.erase(it);
}

编辑:根据OP的要求(按其相对于开始的位置删除)

// loop through all the elements
int i = -1;
for (auto& it = g_messages.begin(); it != g_messages.end(); it++)
{
    if (++i == input_position)
    {
        delete *it;
        g_messages.erase(it);
        break;
    }
}

auto it = g_messages.begin();
if (input_position < g_messages.size())
{
    std::advance(it, input_position);
    g_messages.erase(it);
}

要擦除list<Message*>中的元素,您必须做三件事:

  • 获取指向要删除的元素的迭代器。 不幸的是,列表迭代器是双向的:您可以转到列表的开头或结尾,一次向后移动一步。
  • 删除您指向的对象(顺便说一下,在这里使用智能指针而不是原始指针会更安全:然后您可以跳过这个额外的步骤并确保你没有泄漏内存)
  • 擦除列表中的元素

这里是怎么做的:

auto it = g_messages.begin();   // iterator to start at begin of list 
it++;it++;              // move two steps forward (i.e. 2x  1 step)
delete *it;             // delete the allocated object you point to 
g_messages.erase(it);   // erase the elemnt in the list.  

这里是使用智能指针的快速现场演示。