mismatch

[機能]

  first1 から last1 で指定した範囲が,first2 で指定された要素列と異なる(二項関数オブジェクトで指定した意味で異なる)位置を返します.

[形式]
#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);		

[使用例]

  1. mismatch と equal の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #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 つのシーケンスは等しい			
[参照]

equal

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