第102章 remove_copy_ifアルゴリズム関数を使う


remove_copy_if関数は、元のソースの範囲から条件を満たす値の要素を除いて、コピーを行います。残りの要素の順番は変わりません。戻り値は新しい範囲の最後の次の要素をさしています。



template
   OutputIterator remove_copy_if(
      InputIterator _First, 
      InputIterator _Last, 
      OutputIterator _Result,
      Predicate _Pred
   );

_Firstは、コピー元の最初の要素の反復子です。
_Lastは、コピー元の最後の次の要素の反復子です。
_Resultは、コピー先の反復子です。
_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'以降の文字が取り除かれてコピーされています。



今回も簡単でした。


[Index] [総合Index] [Previous Chapter] [Next Chapter]

Update Jan/22/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。