#include <stdio.h>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
// 誤差の範囲で同じか否かのチェック
//bool Equal(double a, double b) {
// return abs(a-b) < 0.1;
//}
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 = {3.0, 5.0, 4.0, 4.95, 4.05};
printf("vector v1 :");
for (auto x : v1)
printf(" %f", x);
printf("\n");
vector<double> v2 = {3.0, 5.0, 4.0, 5.0, 4.0};
printf("vector v2 :");
for (auto x : v2)
printf(" %f", x);
printf("\n");
// mismatch
printf("**mismatch**\n");
pair <vector<double>::iterator, vector<double>::iterator> p;
p = mismatch(v1.begin(), v1.end(), v2.begin());
if (p.first == v1.end())
printf(" mismatch : 2 つのシーケンスは等しい\n");
else
printf(" mismatch : %f と %f が異なっている\n", *(p.first), *(p.second));
p = mismatch(v1.begin(), v1.end(), v2.begin(), Equal()); // 二項関数オブジェクト
// p = mismatch(v1.begin(), v1.end(), v2.begin(), Equal); // 関数
// p = mismatch(v1.begin(), v1.end(), v2.begin(), [](double a, double b){ return abs(a-b) < 0.1; }); // ラムダ式
if (p.first == v1.end())
printf(" mismatch(Equal) : 2 つのシーケンスは等しい\n");
else
printf(" mismatch(Equal) : %f と %f が異なっている\n", *(p.first), *(p.second));
// equal
printf("**equal**\n");
bool b = equal(v1.begin(), v1.end(), v2.begin());
if (b)
printf(" equal : 2 つのシーケンスは等しい\n");
else
printf(" equal : 2 つのシーケンスは等しくない\n");
b = equal(v1.begin(), v1.end(), v2.begin(), Equal());
// b = equal(v1.begin(), v1.end(), v2.begin(), Equal); // 関数
// p = equal(v1.begin(), v1.end(), v2.begin(), [](double a, double b){ return abs(a-b) < 0.1; });
if (b)
printf(" equal(Equal) : 2 つのシーケンスは等しい\n");
else
printf(" equal(Equal) : 2 つのシーケンスは等しくない\n");
return 0;
}