unique

[機能]

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

[形式]
#include <algorithm>

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 <cmath>
    #include <vector>
    #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)((abs(a-b) < 0.1) ? 1 : 0);
    		}
    };
    
    int main()
    {
    					// 初期設定
    	vector<double> v1 {4.1, 4.95, 5.0, 8.0, 5.0, 5.0, 7.0};
    	printf("v1 :");
    	for (auto x : v1)
    		printf(" %f", x);
    	printf("\n");
    
    	vector<double> v2;
    	copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));   // inserter 参照
    	printf("v2 :");
    	for (auto x : v2)
    		printf(" %f", x);
    	printf("\n");
    					// v1 の隣り合った重複要素を削除
    	printf("v1 の隣り合った重複要素を削除\n");
    	vector<double>::iterator it, end;
    	end = unique(v1.begin(), v1.end());   // 注意
    	printf("  v1(end) :");
    	for (it = v1.begin(); it != end; it++)
    		printf("  %f", *it);
    	printf("\n");
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %f", x);
    	printf("\n    size of v1 = %d (注意)\n", v1.size());
    					// 初期設定後,v1 の隣り合った重複要素を削除(述語使用)
    	printf("初期設定後,v1 の重複要素を削除(述語使用)\n");
    	v1.clear();
    	copy(v2.begin(), v2.end(), inserter(v1, v1.begin()));
    	end = unique(v1.begin(), v1.end(), Equal());   // 注意,二項関数オブジェクト
    //	end = unique(v1.begin(), v1.end(), [](int a, int b){ return abs(a-b) < 0.1; });   // 注意,ラムダ式
    	printf("  v1(end) :");
    	for (it = v1.begin(); it != end; it++)
    		printf("  %f", *it);
    	printf("\n");
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %f", x);
    	printf("\n    size of v1 = %d (注意)\n", v1.size());
    					// 初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー
    	printf("初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー\n");
    	v1.clear();
    	copy(v2.begin(), v2.end(), inserter(v1, v1.begin()));
    	unique_copy(v1.begin(), v1.end(), v2.begin());
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %f", x);
    	printf("\n");
    	printf("  v2 :");
    	for (auto x : v2)
    		printf("  %f", x);
    	printf("\n");
    					// v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用)
    	printf("v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用)\n");
    	unique_copy(v1.begin(), v1.end(), v2.begin(), Equal());
    	printf("  v1 :");
    	for (auto x : v1)
    		printf("  %f", x);
    	printf("\n");
    	printf("  v2 :");
    	for (auto x : v2)
    		printf("  %f", x);
    	printf("\n");
    
    	return 0;
    }
    			
    (出力)
    v1 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
    v2 : 4.100000 4.950000 5.000000 8.000000 5.000000 5.000000 7.000000
    v1 の隣り合った重複要素を削除
      v1(end) :  4.100000  4.950000  5.000000  8.000000  5.000000  7.000000
      v1 :  4.100000  4.950000  5.000000  8.000000  5.000000  7.000000  7.000000
        size of v1 = 7 (注意)
    初期設定後,v1 の重複要素を削除(述語使用)
      v1(end) :  4.100000  4.950000  8.000000  5.000000  7.000000
      v1 :  4.100000  4.950000  8.000000  5.000000  7.000000  5.000000  7.000000
        size of v1 = 7 (注意)
    初期設定後,v1 の隣り合った重複要素を削除し,v2 にコピー
      v1 :  4.100000  4.950000  5.000000  8.000000  5.000000  5.000000  7.000000
      v2 :  4.100000  4.950000  5.000000  8.000000  5.000000  7.000000  7.000000
    v1 の隣り合った重複要素を削除し,v2 にコピー(述語使用)
      v1 :  4.100000  4.950000  5.000000  8.000000  5.000000  5.000000  7.000000
      v2 :  4.100000  4.950000  8.000000  5.000000  7.000000  7.000000  7.000000
    			
[参照]

unique_copy

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