我试图从对象列表中删除一个元素,如果其中一个对象的属性与条件匹配.这是我的功能,但是,在执行此操作然后打印内容后,erase()似乎没有任何效果.我在这做错了什么?
void FileReader::DeleteProcess(int id, list<Process> listToDeleteFrom)
{
list<Process>::iterator process;
for(process = listToDeleteFrom.begin(); process != listToDeleteFrom.end(); process++)
{
if (process -> ID == id)
{
listToDeleteFrom.erase(process);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*our 10
首先,您需要通过引用传递列表; 您的代码正在处理副本,因此它所做的更改不会影响调用者的列表:
void FileReader::DeleteProcess(int id, list<Process> & listToDeleteFrom)
^
Run Code Online (Sandbox Code Playgroud)
其次,擦除列表元素会使引用该元素的任何迭代器无效,因此尝试继续进行迭代将导致未定义的行为.如果只有一个要删除的元素,则在调用后直接从函数返回erase; 否则,循环需要结构如下:
for (auto it = list.begin(); it != list.end(); /* don't increment here */) {
if (it->ID == id) {
it = list.erase(it);
} else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
erase()当迭代器迭代时调用使迭代器list无效.将要擦除的元素添加到第二个列表,然后将其删除.
另请注意,您是按值传递列表而不是使用引用或指针.你的意思是用list<Process>& listToDeleteFrom还是list<Process>* listToDeleteFrom?