remove_if関数は、元のソースの範囲から条件を満たす値の要素を取り除きます。戻り値が新しい配列の最後の次の要素を指します。
template_Firstは取り除き対象となる範囲の最初の要素を指す反復子です。ForwardIterator remove_if( ForwardIterator _First, ForwardIterator _Last, Predicate _Pred );
_Lastは取り除きたい章となる範囲の最後の次を指す反復子です。
_Predは、条件を記述した関数です。
では、早速サンプルを見てみましょう。
// removeif01.cpp
#include <iostream>
#include <vector>
#include <algorithm>
bool cond(int);
using namespace std;
int main()
{
vector<int> v1, v2;
vector<int>::iterator p1, p2, p3;
int i;
for (i = 0; i < 10; i++)
v1.push_back(i);
for (p1 = v1.begin(); p1 != v1.end(); p1++)
cout << *p1 << ",";
cout << endl;
p2 = remove_if(v1.begin(), v1.end(), cond);
for (p1 = v1.begin(); p1 != p2; p1++)
cout << *p1 << ",";
cout << endl;
return 0;
}
bool cond(int x) {
if (x % 2 == 0)
return true;
else
return false;
}
実行結果は次の図のようになります。
条件の関数は、2で割り切れたらtrueを返すので偶数は除去されます。
結果は奇数のみが表示されるというわけです。
もちろん、コンテナだけでなく普通の配列に対しても使えます。
// removeif02.cpp
#include <iostream>
#include <algorithm>
bool cond(int);
using namespace std;
int main()
{
int a[10], i;
int *p, *end;
for (i = 0; i < 10; i++)
a[i] = i;
for (i = 0; i < 10; i++)
cout << a[i] << ",";
cout << endl;
end = remove_if(a, a + 10, cond);
for (p = a; p != end; p++)
cout << *p << ",";
cout << endl;
return 0;
}
bool cond(int x)
{
if (x % 2 == 0)
return true;
else
return false;
}
結果は前プログラムと同じです。なんか、いろいろアルゴリズム関数はいっぱいありますが使い方そのものはたいしたことないですね。
Update Apr/03/2006 By Y.Kumei