#include <algorithm> template <class InputIterator1, class InputIterator2> pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); template <class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
#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; }
vector v1 : 3.000000 5.000000 4.000000 4.950000 4.050000 vector v2 : 3.000000 5.000000 4.000000 5.000000 4.000000 **mismatch** mismatch : 4.950000 と 5.000000 が異なっている mismatch(Equal) : 2 つのシーケンスは等しい **equal** equal : 2 つのシーケンスは等しくない equal(Equal) : 2 つのシーケンスは等しい
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |