#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;
}