inplace_merge

[機能]

  同じ系列内の first から middle で指定した部分と,middle から last で指定した部分をマージします.2 引数の比較関数を指定することも可能です(下の表現).なお,各々の領域は,前もってソートしておく必要があります.

[形式]
	#include <algorithm>
	#include <functional>

	template <class BidirectionalIterator> void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last);
	template <class BidirectionalIterator, class Compare> void inplace_merge(BidirectionalIterator first, BidirectionalIterator middle, BidirectionalIterator last, Compare comp);
		

[使用例]

  1. inplace_merge の使用方法です.
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    bool less_a(int a, int b)
    {
    	return (bool)((a < b) ? 1 : 0);
    };
    
    class less_b : public binary_function<int, int, bool>
    {
    	public:
    		result_type operator() (first_argument_type a, second_argument_type b)
    		{
    			return (result_type)((a < b) ? 1 : 0);
    		}
    };
    
    int main()
    {
    	vector<int> v1, v2, v3;
    	vector<int>::iterator it;
    					// 初期設定
    	printf("**初期状態 v1**\n");
    	v1.push_back(5);
    	v1.push_back(10);
    	v1.push_back(4);
    	v1.push_back(3);
    	v1.push_back(7);
    	v1.push_back(1);
    	v1.push_back(9);
    	v1.push_back(8);
    	v1.push_back(6);
    	v1.push_back(2);
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  %d", *it);
    	printf("\n");
    					// 半分ずつ小さい順にソート
    	printf("半分ずつ小さい順にソート\n");
    	sort(v1.begin(), v1.begin()+5);
    	sort(v1.begin()+5, v1.end());
    							// 以下の方法でも可能
    //	sort(v1.begin(), v1.begin()+5, less_a);
    //	sort(v1.begin()+5, v1.end(), less_a);
    //	sort(v1.begin(), v1.begin()+5, less_b());
    //	sort(v1.begin()+5, v1.end(), less_b());
    //	sort(v1.begin(), v1.begin()+5, less<int>());
    //	sort(v1.begin()+5, v1.end(), less<int>());
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  %d", *it);
    	printf("\n");
    					// 全体をマージ
    	printf("全体をマージ\n");
    	inplace_merge(v1.begin(), v1.begin()+5, v1.end());
    							// 以下の方法でも可能
    //	inplace_merge(v1.begin(), v1.begin()+5, v1.end(), less_a);
    //	inplace_merge(v1.begin(), v1.begin()+5, v1.end(), less_b());
    //	inplace_merge(v1.begin(), v1.begin()+5, v1.end(), less<int>());
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  %d", *it);
    	printf("\n");
    
    	return 0;
    }
    
    (出力)
    
    **初期状態 v1**
      5  10  4  3  7  1  9  8  6  2
    半分ずつ小さい順にソート
      3  4  5  7  10  1  2  6  8  9
    全体をマージ
      1  2  3  4  5  6  7  8  9  10
    			
[参照]

sortmerge

ホームページ 目次 演習解答例目次 付録目次 索引