当我遍历一个集合并想要删除某些项时,迭代器会被更改。这会导致段错误,因为删除后迭代失败。我怎样才能克服这个问题?
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++);
答案 0 :(得分: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,因此它应该不是问题。