0

最近、私が維持しているコードで次のことを見つけました。

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  base_container::erase((++rit).base());
}

reverse_iterator を使用して、ループ内のコンテナー (この場合は std::list) から最後の要素を削除しようとします。要点は、正しく動作するように見えますが、そうではありません (無効なイテレータが原因でメモリの破損が発生する場合があります)。なぜでしょうか? そうしないための制限や規則はありますか?

ありがとう。

PSソリューションの改善を防ぐために、私はすでにそれを書き直して機能させました。問題は、上記のコードが正しく機能しない理由です。

4

3 に答える 3

1

イテレータの無効化を回避するには、戻り値を保存してerase()から変換する必要があります。reverse_iterator

for (reverse_iterator rit = base_container::rbegin(); rit != base_container::rend() && 0 < N; N--) 
{
  another_container->push_back(*rit);
  auto it =base_container::erase((++rit).base()); //erase will return an iteraotor
  rit(it);//converting iterator to reverse_iterator.
}
于 2015-07-20T13:33:24.900 に答える
1

rit呼び出しによって無効になりeraseます。

于 2015-07-20T13:04:25.123 に答える