C/C++ 入門

ホーム > STL の使い方 > remove

remove

スポンサーリンク

remove は指定した範囲から、特定の値を消去します。

戻り値は削除操作を行った最後を指すイテレータです。これが何のことか、下の動作例をみてください。

次の例では 001122...999 という風に要素が設定された int の vector を作成し、その中から remove を使って 6 の要素を削除します。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
	vector<int> v;
	vector<int>::iterator i;
	
	// vector の準備
	// これで v が 0,0,1,1,2,2,...,9,9 となります。

	for( int n=0; n < 10; n++ ){
		v.push_back(n);
		v.push_back(n);
	}
	
	// 内容を出力
	i = v.begin();
	while( i != v.end() ){
		cout << *i;
		i++;
	}
	cout << endl;
	
	// 6 を削除
	vector<int>::iterator e = remove( v.begin(), v.end(), 6 );

	// 内容を出力
	i = v.begin();	
	while( i != e ){
		cout << *i;
		i++;
	}
	cout << endl;
	
	return 0;
}

これを実行すると次のようになりました。

$ ./a.out
00112233445566778899
001122334455778899

確かに 6 がなくなってます。

ここではループは v の先頭 v.begin() から、remove が返した e まで行っています。

注意すべき点は、remove を実行しても、要素そのものは元のままであるという点です。値が詰められるだけです。 このため、e までではなく、v.end() までの内容をダンプするように下記コードを追加すると・・・

         
	i = v.begin();
	while( i != v.end() ){
		cout << *i;
		i++;
	}
	cout << endl;
	
	return 0;
}

実行結果は次のようになります。

$ ./a.out
00112233445566778899
001122334455778899
00112233445577889999

6 という値は削除されましたが、値を削除して値を前に詰めていった結果、後ろの要素は元のまま残っています。 この部分を消去するには erase で消去範囲を指定します。

	...
	// 不要な要素を消去
	v.erase( e, v.end() );
	
	i = v.begin();
	while( i != v.end() ){
		cout << *i;
		i++;
	}
	cout << endl;
	...

このように単に remove を呼んだだけではコンテナのサイズが変わらない点には、注意しましょう。

スポンサーリンク
ホーム > STL の使い方 > remove