std :: list :: erase无效

Kyl*_*ksa 1 c++ stl

我试图从对象列表中删除一个元素,如果其中一个对象的属性与条件匹配.这是我的功能,但是,在执行此操作然后打印内容后,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)


akt*_*ton 6

erase()当迭代器迭代时调用使迭代器list无效.将要擦除的元素添加到第二个列表,然后将其删除.

另请注意,您是按值传递列表而不是使用引用或指针.你的意思是用list<Process>& listToDeleteFrom还是list<Process>* listToDeleteFrom?