【发布时间】:2013-01-04 18:10:25
【问题描述】:
当我迭代一个集合并想要删除某些项目时,迭代器会改变。这会导致段错误,因为删除后迭代失败。我该如何克服这个问题?
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++);
【问题讨论】:
-
使用
erase的返回值作为迭代器恢复值,else正常递增。 -
candidates.erase( remove_if( candidates.begin(), candidates.end() ), [](){ some constraint satisfied } ), candidates.end() ); -
@Omnifarious 那是真的 - 无论如何,裁判可能会帮助 OP。
-
@K-ballo:因为 C++11
std::set::iterator是一个 constant 双向迭代器。我几乎不相信 remove_if 可以对此进行操作。此外,如果这是可能的,您将破坏log N的复杂性find()。