1

可能重复:
迭代器有效性,在 std::set 中的 erase() 调用之后

当我迭代一个集合并想要删除某些项目时,迭代器会更改。这会导致段错误,因为删除后迭代失败。我该如何克服这个问题?

std::set< std::pair<double,unsigned>, comparisonFunction> candidates;'
[...]

for( auto it = candidates.begin(); it != candidates.end(); ++it)
{
  [...]
  if ( some constraint satisfied)
  {
    candidates.erase(it);
  }
}

使用此代码时遇到段错误。我的猜测是,这要么是由于迭代器损坏,要么是由于在某些情况下要删除的元素是最后一个元素。迭代器上的后增量是否克服了这个问题?像这样:

candidate.erase(it++);
4

1 回答 1

8

使用的返回值erase

it = candidates.erase(it);

请注意,如果您删除一个元素,则不能增加it,否则您的迭代器可能会失效。

for( auto it = candidates.begin(); it != candidates.end();)
{
  if ( some constraint satisfied)
  {
    it = candidates.erase(it);
  }
  else
    ++it;
}

另请注意,这在 C++03 中是不可能的,因为erase没有返回任何迭代器。但是,由于您使用的是 C++11,所以这应该不是问题。

参考

于 2013-01-04T18:12:34.130 回答