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

プログラミング
スポンサーリンク

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のメンバーを削除する方法
C++のSTL(標準テンプレートライブラリ)でwhileループ中にmapのメンバーを削除する方法を調べてみました。 C++のSTL(標準テンプレートライブラリ) Javaのプログラムを数年やってきた後で、C++を使い始めるとC++...

を真似た以下のサンプルでも動作しません。

 

 

上記のプログラムを実行すると以下のエラーが表示されます。

 

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>

 

プログラミングの無料レッスン体験

 

約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp

<Codecampの特徴>

1 現役エンジニアによる指導

2オンラインでのマンツーマン形式の講義

3大手企業にも導入されている実践的なカリキュラム

↓無料体験レッスン実施中です。

プログラミングのオンラインスクールCodeCamp

 

 

 

プログラミング
スポンサーリンク
スポンサーリンク
うらしたをフォローする
スポンサーリンク
urashita.com 浦下.com (ウラシタドットコム)

コメント

タイトルとURLをコピーしました