C++のSTL(Standard Template Library、標準テンプレートライブラリ)でvectorのメンバーを削除する

シェアする

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

スポンサードリンク

C++でループしてvectorのメンバーを削除

C++のSTL(Standard Template Library)でループ処理の途中でvectorのメンバーを削除することはよくあります。
サンプルコードは以下の通りです。

実行結果は以下の通りです。

注意点は、std::vector::eraseを実行すると、次のiteratorのポインターを返却すということです。
上記のコードの場合
it = myVector.erase(it);
ではなくて単に
myVector.erase(it);
として実行すると、以下のエラーが発生します。

GW-01671

Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio
11.0\vc\include\vector
Line: 101

Expression: vector iterator not incrementable

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

スポンサードリンク

別のエラーサンプル

ちなみにvectorのメンバーを削除する場合、C++のSTL(標準テンプレートライブラリ)でwhileループ中にmapのメンバーを削除する方法 を真似た以下のサンプルでも動作しません。

上記のプログラムを実行すると以下のエラーが表示されます。
GW-01672
Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files (x86)\microsoft visual studio
11.0\vc\include\vector
Line: 240

Expression: vector iterator incompatible

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

上記のコードの場合でも
myVector.erase(it++);
ではなくて
it = myVector.erase(it);
とすれば正しく実行されます。

スポンサードリンク

エラー(vector iterator not incrementable/incompatible)がアサーション(assertion)で表示されている

上記の二つのエラーサンプルがともにアサーション(assertion)で表示されている点に注意しよう。
Expression: vector iterator not incrementable
Expression: vector iterator incompatible
アサーションとは、プログラムの前提として満たされるべき条件をあらかじめ記述して、その条件を満たさない時に例外を発生させる機能です。
もしアサーション(assertion)を行っていないと、このエラーメッセージのようなわかりやすいダイアログを表示することがなく、プログラムがメモリ不正で異常終了することになります。
この場合は、コアダンプのようなファイルを解析して異常終了した原因を追跡することになります。
プロジェクトで自分で作るプログラムも極力アサーションを用意しておけば、不具合の起こりにくいプログラム、または、不具合原因を特定しやすいプログラムを作ることが可能になります。

その他エラーのメモ

ここで紹介した以外によく発生するエラーをまとめてみました。

エラーメッセージとして「Error: 識別子”cout”が定義されていません」と表示されることがあります。
対策として以下を入れてみてください。
#include <iostream>
using namespace std;

エラーメッセージとして「Error: 識別子”vector”が定義されていません」と表示されることがあります。
対策として以下を入れてみてください。
#include <vector>
using namespace std;

エラーメッセージとして「Error: これらのオペランドと一致する演算子”<<”はありません オペランドの型: std::ostream<<std::string」と表示されることがあります。
対策として以下を入れてみてください。
#include <string>

シェアする

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

フォローする

コメントをどうぞ

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