C++のSTL(標準テンプレートライブラリ)でwhileループ中にmapのメンバーを削除する方法

シェアする

  • このエントリーをはてなブックマークに追加

スポンサードリンク

C++のSTL(標準テンプレートライブラリ)

Javaのプログラムを数年やってきた後で、C++を使い始めるとC++の標準テンプレートライブラリ(Standard Template Library)のコンテナに病み付きになります。
これなくして、C++のプログラマーはやってこれたのでしょうか。
vector, list, set, map, multiset, multimapなど基本はJavaで標準実装されているものと似ています。というかほとんど一緒です。

スポンサードリンク

whileループ中にmapのメンバーを削除する方法

ところで、mapにデータを格納して、whileループで読みだす時に格納されたデータを削除したいことがよくあります。
削除する方法・コードのサンプルは以下の通りです。

上記のプログラムを実行すると以下の結果になります。

ポイントはイテレータをインクリメントしてから元の方を削除しているところです。
このように削除しないと動作しません。
map1.erase(++it)はNG
map1.erase(it++)はOK
です。

スポンサードリンク

Expression: map/set erase iterator outside range

NGコードの方を実行すると以下のエラーが発生します。

GW-01640

Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: C:\Program Files (x86)\Microsoft Visual Studio
11.0\VC\include\xtree
Line: 1326

Expression: map/set erase iterator outside range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

まとめ

コンテナのループで一部のメンバーを削除するケースはよくあります。
forループで同様のことが出来ればよいのですが、ちょっと難しそうです。
メンバ削除の場合はforループでなくてwhileループを使いましょう。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です