从结构类型列表中擦除元素
Erase element from list of type struct
这是我的列表的声明:list<Message*> g_messages;
其中Message
是struct
.
我想删除列表的某个位置(消息)。如果它是一个向量,我会这样做:
//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.
这里是使用智能指针的快速现场演示。
相关文章:
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么在功能内擦除元素后不列出更新?
- 在任一方向上迭代容器并擦除元素
- 从向量和对向量中擦除元素的差异
- 从地图上擦除元素,然后将其放回原处
- 迭代一组和擦除元素
- 使用常量键从集合中擦除元素
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 如何更有效地从向量或集合中擦除元素?
- 在尝试擦除元素之前,我们是否需要检查unordered_set是否包含元素
- 从矢量中最快的擦除元素或更好地利用内存(排序基数)
- 迭代地图和擦除元素
- 迭代时从 STL 容器中查找并擦除元素
- 在 c++ 中从列表中擦除元素时出现问题
- C++嵌套的带有擦除元素的循环
- 矢量2D擦除元素并保持字段为空
- 比较第一个向量的不同矢量迭代器和擦除元素
- 从多维矢量中擦除元素
- 根据属性值在结构向量中擦除元素
- 从hash_map内的列表中擦除元素