这是我的清单声明:list<Message*> g_messages;
其中Message
是struct
。
我想删除列表的某个位置(消息)。如果它是一个向量,我会这样做:
//delete g_messages[id];
列表.erase()必须使用,但我不知道如何。
g_messages.erase(id);
无效。有人建议使用迭代器,但如何链接const int
id和迭代器?
答案 0 :(得分:2)
这就是你如何使用列表,你必须遍历所有这些,因为它们是双链表(每个元素都包含指向前一个和下一个元素的指针)。
// 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;
}
}
OR
auto it = g_messages.begin();
if (input_position < g_messages.size())
{
std::advance(it, input_position);
g_messages.erase(it);
}
答案 1 :(得分:1)
要删除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.
这里使用智能指针快速live demo。