stable_sort

[機能]

  指定した範囲をソートします.その際,等しい要素の並び順が保持されます.2 引数の比較関数を指定することも可能です(下の表現).

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

	template <class RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last);
	template <class RandomAccessIterator, class Compare> void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
		

[使用例]

  1. sort と stable_sort の使用方法です.2 つの方法の違いが分かるような方法が見つかりませんでした.
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    bool less_a(pair<int,int> a, pair<int,int> b)
    {
    	return (bool)((a.first < b.first) ? 1 : 0);
    };
    
    class less_b : public binary_function<pair<int,int>, pair<int,int>, bool>
    {
    	public:
    		result_type operator() (first_argument_type a, second_argument_type b)
    		{
    			return (result_type)((a.first < b.first) ? 1 : 0);
    		}
    };
    
    int main()
    {
    	vector<pair<int, int> > v1, v2;
    	vector<pair<int, int> >::iterator it;
    					// 初期設定
    	printf("**初期状態 v1**\n");
    	v1.push_back(pair<int, int>(3,10));
    	v1.push_back(pair<int, int>(2,22));
    	v1.push_back(pair<int, int>(2,21));
    	v1.push_back(pair<int, int>(3,30));
    	v1.push_back(pair<int, int>(2,20));
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  (%d, %d)", it->first, it->second);
    	printf("\n");
    
    	printf("**初期状態 v2**\n");
    	v2 = v1;
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf("  (%d, %d)", it->first, it->second);
    	printf("\n");
    					// 小さい順にソート(v1, sort)
    	printf("小さい順にソート(v1, sort)\n");
    	sort(v1.begin(), v1.end(), less_a);
    							// 以下の方法でも可能
    //	sort(v1.begin(), v1.end(), less_b());
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  (%d, %d)", it->first, it->second);
    	printf("\n");
    					// 小さい順にソート(v2, stable_sort)
    	printf("小さい順にソート(v2, stable_sort)\n");
    	stable_sort(v2.begin(), v2.end(), less_a);
    							// 以下の方法でも可能
    //	stable_sort(v2.begin(), v2.end(), less_b());
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf("  (%d, %d)", it->first, it->second);
    	printf("\n");
    
    	return 0;
    }
    
    (出力)
    
    **初期状態 v1**
      (3, 10)  (2, 22)  (2, 21)  (3, 30)  (2, 20)
    **初期状態 v2**
      (3, 10)  (2, 22)  (2, 21)  (3, 30)  (2, 20)
    小さい順にソート(v1, sort)
      (2, 22)  (2, 21)  (2, 20)  (3, 10)  (3, 30)
    小さい順にソート(v2, stable_sort)
      (2, 22)  (2, 21)  (2, 20)  (3, 10)  (3, 30)
    			
[参照]

sort

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