C++遍历list时修改容器的疑问:C++11中删除stopped标记为true的元素的代码为何被判定错误?
你的代码问题解析
嘿,我来帮你把这段代码的问题掰扯清楚!
首先最核心的错误是逻辑判断完全搞反了:你的需求是删除所有stopped标记为true的元素,但你写的条件是if (!job->stopped)——也就是当元素的stopped是false的时候才去删除它,这相当于把你要保留的元素删掉了,反而留下了所有stopped=true的元素,完全和需求背道而驰。
不过有一点你是做对的:在使用list::erase时,你用它的返回值来更新迭代器,这是正确的操作——因为list是链表结构,erase会返回被删除元素的下一个有效迭代器,不需要你再手动++job;而当不需要删除元素时,手动移动迭代器到下一个位置也是对的。
那修正后的代码应该是这样的:
auto job = jobs.begin(); while (job != jobs.end()) { if (job->stopped) { // 这里改成判断stopped为true时删除 job = jobs.erase(job); } else { ++job; } }
另外,在C++11及之后的标准里,其实可以用list自带的remove_if方法来更简洁地实现这个需求,代码可读性更高,也不容易写错逻辑:
jobs.remove_if([](const auto& job_item) { return job_item.stopped; // 直接指定删除条件:stopped为true的元素 });
内容的提问来源于stack exchange,提问作者user15687371
相关产品推荐
相关产品推荐

