这是我的列表声明:list<Message*> g_messages;
哪里Message
是 struct
.
我想删除列表的某个位置(一条Message)。如果它是一个 vector ,我会这样做:
//delete g_messages[id];
with lists .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;
}
}
另一种选择是使用 <algorithm>
中的 std::find_if它需要一个谓词
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);
}
关于c++ - 从结构类型列表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35281417/