next_permutation

[機能]

  系列の各要素を辞書的順序で並べた場合において,現在の並べ方の次になる並べ方を返します.次の並べ方が存在しない場合,辞書的順序における最初の並べ方に並べ替えます.たとえば,a,b,c という 3 つの要素からなる系列の場合,辞書的順序でこれらを並べると,以下のようになります在します.
  a b c, a c b, b a c, b c a, c a b, c b a
2 引数の比較関数を指定することも可能です(下の表現).

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

	template <class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
	template <class BidirectionalIterator, class Compare> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
		

[使用例]

  1. next_permutation と prev_permutation の使用方法です.
    #include <stdio.h>
    #include <vector>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    bool less_a(char a, char b)
    {
    	return (bool)((a < b) ? 1 : 0);
    };
    
    class less_b : public binary_function<char, char, bool>
    {
    	public:
    		result_type operator() (first_argument_type a, second_argument_type b)
    		{
    			return (result_type)((a < b) ? 1 : 0);
    		}
    };
    
    int main()
    {
    	bool b;
    	vector<char> v1, v2;
    	vector<char>::iterator it;
    					// 初期設定
    	printf("**初期状態 v1**\n");
    	v1.push_back('a');
    	v1.push_back('b');
    	v1.push_back('c');
    	for (it = v1.begin(); it != v1.end(); it++)
    		printf("  %c", *it);
    	printf("\n");
    					// 次の並び順
    	printf("次の並び順\n");
    	b = next_permutation(v1.begin(), v1.end(), less_a);
    							// 以下の方法でも可能
    //	b = next_permutation(v1.begin(), v1.end(), less_b());
    	if (b) {
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  次の並び順は存在しません\n");
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    					// 前の並び順
    	printf("前の並び順\n");
    	b = prev_permutation(v1.begin(), v1.end(), less_a);
    	if (b) {
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  前の並び順は存在しません\n");
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    					// 前の並び順
    	printf("前の並び順\n");
    	b = prev_permutation(v1.begin(), v1.end(), less_a);
    	if (b) {
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  前の並び順は存在しません\n");
    		for (it = v1.begin(); it != v1.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    					// 初期設定
    	printf("**初期状態 v2**\n");
    	v2.push_back('c');
    	v2.push_back('b');
    	v2.push_back('a');
    	for (it = v2.begin(); it != v2.end(); it++)
    		printf("  %c", *it);
    	printf("\n");
    					// 前の並び順
    	printf("前の並び順\n");
    	b = prev_permutation(v2.begin(), v2.end(), less_a);
    	if (b) {
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  前の並び順は存在しません\n");
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    					// 次の並び順
    	printf("次の並び順\n");
    	b = next_permutation(v2.begin(), v2.end(), less_a);
    	if (b) {
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  次の並び順は存在しません\n");
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    					// 次の並び順
    	printf("次の並び順\n");
    	b = next_permutation(v2.begin(), v2.end(), less_a);
    	if (b) {
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    	else {
    		printf("  次の並び順は存在しません\n");
    		for (it = v2.begin(); it != v2.end(); it++)
    			printf("  %c", *it);
    		printf("\n");
    	}
    
    	return 0;
    }
    
    (出力)
    
    **初期状態 v1**
      a  b  c
    次の並び順
      a  c  b
    前の並び順
      a  b  c
    前の並び順
      前の並び順は存在しません
      c  b  a
    **初期状態 v2**
      c  b  a
    前の並び順
      c  a  b
    次の並び順
      c  b  a
    次の並び順
      次の並び順は存在しません
      a  b  c
    			
[参照]

prev_permutation

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