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