remove_copy_if関数は、元のソースの範囲から条件を満たす値の要素を除いて、コピーを行います。残りの要素の順番は変わりません。戻り値は新しい範囲の最後の次の要素をさしています。
template_Firstは、コピー元の最初の要素の反復子です。OutputIterator remove_copy_if( InputIterator _First, InputIterator _Last, OutputIterator _Result, Predicate _Pred );
これも、使い方は簡単です。 例題をみてみましょう。
// removecopyif01.cpp
#include <iostream>
#include <vector>
#include <algorithm>
bool chk(int);
using namespace std;
int main()
{
int i;
vector<int>v1, v2(5);
vector <int>::iterator p, e;
for (i = 0; i < 5; i++)
v1.push_back(i);
e = remove_copy_if(v1.begin(), v1.end(), v2.begin(), chk);
for (p = v2.begin(); p != e; p++)
cout << *p << ",";
cout << endl;
return 0;
}
bool chk(int x)
{
if (x > 2)
return true;
else
return false;
}
chk関数は、条件の判定を行います。これがtrueを返すものを
取り除いてコピーします。では、実行結果を見てみましょう。
v1の要素のうち2より大きい要素を取り除いてv2にコピーしています。
従って、v2を表示すると0, 1, 2となるわけです。
コンテナではなく、普通の配列にも使えます。
// removecopyif02.cpp
#include <iostream>
#include <algorithm>
using namespace std;
bool chk(char);
int main()
{
char szA[] = {'A', 'B', 'C', 'D', 'E'}, szB[5], *lpend, *lpB;
int i;
lpend = remove_copy_if(szA, szA + 4, szB, chk);
for (i = 0; i < 5; i++)
cout << szA[i] << ",";
cout << endl;
for (lpB = szB; lpB != lpend; lpB++)
cout << *lpB << ",";
cout << endl;
return 0;
}
bool chk(char a)
{
if (a >= 'D')
return true;
else
return false;
}
実行結果は次のようになります。
'D'以降の文字が取り除かれてコピーされています。
今回も簡単でした。
Update Jan/22/2006 By Y.Kumei