unique

[機能]

  指定した範囲の指定した重複した要素(上の表現),または,二項関数オブジェクトを真にする意味で重複した要素(下の表現)を削除します.ただし,コンテナのサイズ自身は変化しません.

[形式]
	#include <algorithm>
	#include <functional>

	template <class forwardIterator> ForwardIterator unique(ForwardIterator first, ForwardIterator last);
	template <class forwardIterator, class BinaryPredicate> ForwardIterator unique(ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
		

[使用例]

  1. unique と unique_copy の使用方法です.
    #include <stdio.h>
    #include <math.h>
    #include <vector>
    #include <functional>
    #include <algorithm>
    using namespace std;
    					// 誤差の範囲で同じか否かのチェック
    class Equal : public binary_function<double, double, bool>
    {
    	public:
    		result_type operator() (first_argument_type a, second_argument_type b)
    		{
    			return (result_type)((fabs(a-b) < 0.1) ? 1 : 0);
    		}
    };
    
    int main()
    {
    	vector<double> v1, v2;
    	vector<double>::iterator it, end;
    					// 初期設定
    	printf("**初期状態 v1**\n");
    	v1.push_back(3.0);
    	v1.push_back(4.1);
    	v1.push_back(4.95);
    	v1.push_back(5.0);
    	v1.push_back(8.0);
    	v1.push_back(5.0);
    	v1.push_back(5.0);
    	v1.push_back(7.0);
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    
    	printf("**初期状態 v2**\n");
    	copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    					// v1 の重複要素を削除
    	printf("v1 の重複要素を削除\n");
    	end = unique(v1.begin(), v1.end());   // 注意
    	for (it = v1.begin(); it != end; it++)
    		printf(" %f", *it);
    	printf("\n");
    	printf(" v1 の size : %d (注意)\n", v1.size());
    					// 初期設定後,v1 の重複要素を削除(述語使用)
    	printf("初期設定後,v1 の重複要素を削除(述語使用)\n");
    	copy(v2.begin(), v2.end(), v1.begin());
    	end = unique(v1.begin(), v1.end(), Equal());   // 注意
    	for (it = v1.begin(); it != end; it++)
    		printf(" %f", *it);
    	printf("\n");
    	printf(" v1 の size : %d (注意)\n", v1.size());
    					// 初期設定後,v1 の重複要素を削除し,v2 にコピー
    	printf("初期設定後,v1 の重複要素を削除し,v2 にコピー\n");
    	copy(v2.begin(), v2.end(), v1.begin());
    	unique_copy(v1.begin(), v1.end(), v2.begin());
    	printf(" v1");
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    	printf(" v2");
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    					// v1 の重複要素を削除し,v2 にコピー(述語使用)
    	printf("v1 の重複要素を削除し,v2 にコピー(述語使用)\n");
    	unique_copy(v1.begin(), v1.end(), v2.begin(), Equal());
    	printf(" v1");
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    	printf(" v2");
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf(" %f", *it);
    	printf("\n");
    
    	return 0;
    }
    
    (出力)
    
    **初期状態 v1**
     3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
    **初期状態 v2**
     3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
    v1 の重複要素を削除
     3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 7.000000
     v1 の size : 8 (注意)
    初期設定後,v1 の重複要素を削除(述語使用)
     3.000000 4.100000 4.950000 8.000000 5.000000 7.000000
     v1 の size : 8 (注意)
    初期設定後,v1 の重複要素を削除し,v2 にコピー
     v1 3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
     v2 3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 7.000000 7.000000
    v1 の重複要素を削除し,v2 にコピー(述語使用)
     v1 3.000000 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
     v2 3.000000 4.100000 4.950000 8.000000 5.000000 7.000000 7.000000 7.000000
    			
[参照]

unique_copy

ホームページ 目次 演習解答例目次 付録目次 索引