迭代时从std :: list中删除

时间:2016-03-28 02:24:49

标签: c++ list c++11 stl

我有以下代码:

bool resetTypeBit = true;
for (auto it = eventsList.begin(); it != eventsList.end(); ++it) {
    CreatureEvent* curEvent = *it;
    if (curEvent == event) {
        it = eventsList.erase(it);
    } else if (curEvent->getEventType() == type) {
        resetTypeBit = false;
    }
}

所以我有以下情况:eventList包含01项,然后,只要for语句第一次通过并遇到it = eventsList.erase(it);行,{ {1}}变量无效,导致it语句的下一次迭代出现分段错误。

可能导致问题的任何线索?

2 个答案:

答案 0 :(得分:5)

如果您删除的项目是列表中的最后一项,则content:attr(tooltip)方法将返回erase。然后,您的end()循环将尝试递增该迭代器,从而导致未定义的行为。

你还没有遇到的另一个问题是,如果你删除的项目不是列表中的最后一项,你最终会跳过下面的项目(因为迭代器增加了超过一个for返回)。您可以将erase视为一个增量操作,恰好可以先擦除项目。

解决方案是稍微重构循环,将增量移动到结尾(仅当未调用erase时):

erase

答案 1 :(得分:0)

正如现在编写的那样,即使在erase分支中,也在递增迭代器,这意味着您总是在擦除元素之后跳过该元素。这是不正确的,如果最后一个元素恰好是要删除的元素,则会导致严重的问题。要修复,如果已经通过将it设置为删除后的元素来修复bool resetTypeBit = true; for (auto it = eventsList.begin(); it != eventsList.end(); ) { CreatureEvent* curEvent = *it; if (curEvent == event) { it = eventsList.erase(it); continue; } else if (curEvent->getEventType() == type) { resetTypeBit = false; } ++it; } ,则必须不增加。

layout_weight