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);
  }
}

このコードを使用すると、segfault が発生します。私の推測では、これは破損したイテレータによるものか、場合によっては削除される要素が最後の要素であるという事実によるものです。イテレータのポストインクリメントはこの問題を解決しますか? このような:

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;
}

eraseまた、反復子を返さなかったので、C++03 ではこれが不可能であったことにも注意してください。ただし、C++11 を使用しているため、問題にはなりません。

参考文献

于 2013-01-04T18:12:34.130 に答える