尝试从列表中删除元素时出现“列表迭代器不兼容”错误

4
list<employee> remove_employees(const string& name,
                                const string& lastname) 
{
    list<employee> listOfRemoved; 
    list<employee>::iterator it; 

    for(it=employees.begin(); it != employees.end(); )
    {
        if(it->get_name() == name && it->get_lastname() ==lastname) 
        {
            listOfRemoved.push_back(*it); 
            employees.erase(it); 
        }
        else
            it++;
    }

    return listOfRemoved; 
}

我正试图从类实例变量employees中删除一些员工,然后返回一个新的列表,只包含已删除的员工。当我尝试运行程序时,它会出现标题中的错误。我知道这与擦除和push_back有关,但我就是想不明白。


应该是employees.erase(it),在翻译整个内容时忘记更改为正确的代码。 - Kajzer
你能把编译器的完整消息发布出来,包括行号吗?我刚用VS2010和VS2008编译了这个(在添加一个简单的“employee”结构体后)。顺便说一下,.erase()应该将返回值存储在it中。 - hmjd
调试断言失败。程序:....\vc\include\list\ 行:286 表达式:列表迭代器不兼容 - Kajzer
并使用g++ 4.3.4编译 http://ideone.com/CIdE9。 - hmjd
1个回答

13

更改:

employees.erase(it); 

目标:

it = employees.erase(it); 
否则,在循环的下一次迭代中,it将指向一个无效的元素。list::erase()返回最后一个被移除的元素之后的迭代器。 [我曾将标题解释为编译器错误,而不是运行时错误。]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接