remove_copy_if

[機能]

  指定した範囲の単項関数オブジェクトが真になる要素を削除し,指定した場所にコピーします.ただし,コピー元の要素は変化しません.

[形式]
#include <algorithm>

template <class InputIterator, class OutputIterator, class Predicate>
    OutputIterator remove_copy_if(InputIterator first, InputIterator last,
                                  OutputIterator result, Predicate pred);		

[使用例]

  1. remove,remove_if,remove_copy,及び,remove_copy_if の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    					// 奇数の判定
    class is_odd : public unary_function<int, bool>
    {
    	public:
    		result_type operator() (argument_type k)
    		{
    			return (result_type)(k % 2);
    		}
    };
    
    int main()
    {
    	vector<int> v2;
    					// 初期設定
    	vector<int> v1 {0, 1, 2, 3, 4};
    	printf("v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n");
    
    					// 2 を削除する
    	printf("**v1 の 2 を削除する**\n");
    	vector<int>::iterator it, end;
    	end = remove(v1.begin(), v1.end(), 2);   // 注意
    	printf("  v1(end) :");
    	for (it = v1.begin(); it != end; it++)
    		printf("  %d", *it);
    	printf("\n");
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n    size of v1 = %d (注意)\n", v1.size());
    					// 奇数を削除する
    	printf("**v1 の 奇数を削除する**\n");
    	end = remove_if(v1.begin(), end, is_odd());   // 注意,単項関数オブジェクト
    //	end = remove_if(v1.begin(), end, [](int x){ return x%2 > 0; });   // 注意,ラムダ式
    	printf("  v1(end) :");
    	for (it = v1.begin(); it != end; it++)
    		printf("  %d", *it);
    	printf("\n");
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n    size of v1 = %d (注意)\n", v1.size());
    					// 再初期設定
    	v1.clear();
    	printf("**再設定**\n");
    	printf(" v1 :");
    	for (int i1 = 0; i1 < 5; i1++)
    		v1.push_back(i1+1);
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n    size of v1 = %d\n", v1.size());
    
    	for (int i1 = 0; i1 < 7; i1++)
    		v2.push_back(10*(i1+1));
    	printf(" v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n    size of v2 = %d\n", v2.size());
    					// 2 を削除し v2 にコピー
    	printf("**v1 の 2 を削除し v2 にコピー**\n");
    	remove_copy(v1.begin(), v1.end(), v2.begin(), 2);
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n    size of v1 = %d\n", v1.size());
    	printf("  v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n    size of v2 = %d\n", v2.size());
    					// 奇数を削除し v2 にコピー
    	printf("**v1 の 奇数を削除し v2 にコピー**\n");
    	remove_copy_if(v1.begin(), v1.end(), v2.begin(), is_odd());
    //	remove_copy_if(v1.begin(), v1.end(), v2.begin(), [](int x){ return x%2 > 0; });
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %d", x);
    	printf("\n    size of v1 = %d\n", v1.size());
    	printf("  v2 :");
    	for (auto x : v2)
    		printf("  %d", x);
    	printf("\n    size of v2 = %d\n", v2.size());
    
    	return 0;
    }
    			
    (出力)
    v1 :  0  1  2  3  4
    **v1 の 2 を削除する**
      v1(end) :  0  1  3  4
      v1 :  0  1  3  4  4
        size of v1 = 5 (注意)
    **v1 の 奇数を削除する**
      v1(end) :  0  4
      v1 :  0  4  3  4  4
        size of v1 = 5 (注意)
    **再設定**
     v1 :  1  2  3  4  5
        size of v1 = 5
     v2 :  10  20  30  40  50  60  70
        size of v2 = 7
    **v1 の 2 を削除し v2 にコピー**
      v1 :  1  2  3  4  5
        size of v1 = 5
      v2 :  1  3  4  5  50  60  70
        size of v2 = 7
    **v1 の 奇数を削除し v2 にコピー**
      v1 :  1  2  3  4  5
        size of v1 = 5
      v2 :  2  4  4  5  50  60  70
        size of v2 = 7
    			
[参照]

copyremove_ifremoveremove_copy

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引