【STL】next_permutation函数用法

1)如果给你组数:1 2 3 4 5 

2)如果给出的条件是让你从小到大求出下一个排列,当然就是:1 2 3 5 4

3)如果再下一个就是:1 2 4 3 5  ;再下一个是:1 2 4 5 3

4)如果问你求的是下n个排列是什么?你该怎么快速求出呢???

当然,在(2)中的答案可以从(1)中的倒数第一位与第二位比较,如果倒数第一位比第二位大,那么交换位置,然后下一个排列就是交换后的了,即:1 2 3 5 4

然后依次下去用这种思想可以求出下面的排列……

但是你想想每位都要比较判断,如果相等又往前推,依次这样的话,判断语句又多,代码也不会短,你不烦我还烦呢…… ^_^ 嘿嘿,想偷懒就得想个法子解决问题……

所以懒也是有原因的……next_permutation出场的时候就到了……



使用方法:next_permutation(数组头地址,数组尾地址);若下一个排列存在,则返回真,如果不存在则返回假

举例:

1)数据数组

int main()
{
    int a[6] = {1, 2, 3, 5, 4};
    if (next_permutation(a, a + 5))
    {
        for (int i = 0; i < 5; i++)
        {
            cout << a[i] <<' ';
        }
    }
    return 0;
}

输出:1 2 4 5 3;也就是12 3 5 4的下一个排列咯,是不是很快……


2)字符串(字母数组)

int main()
{
    string str = "abcde"; ///输出下5个排列
    int k = 0;
    while (next_permutation(str.begin(), str.end()))
        ///begin()与end()是string类的迭代器
    {
        k++;
        cout << str << endl;
        if (k == 5)
        {
            break;
        }
    }
    return 0;

输出:

abced

abdce

abdec

abecd

abedc

问题又来了,既然next_permutation可以求下一个排列,那有没有函数可以求上一个排列的?当然有啦!就是prev_permutation

用法与next_permutation是一样的。

例:

int main()
{
    string str = "abecd";
    if (prev_permutation(str.begin(), str.end()))
        ///begin()与end()是string类的迭代器
    {
        cout << str << endl;
    }
    return 0;
}

输出:abdec;//看上面例子


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值