前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中的 std::next_permutation 和 prev_permutation

C++ 中的 std::next_permutation 和 prev_permutation

作者头像
鲸落c
发布2022-11-14 16:43:24
5070
发布2022-11-14 16:43:24
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记

theme: channing-cyan highlight: a11y-dark


「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

std::next_permutation

它用于将范围 [first, last) 中的元素重新排列为下一个字典序更大的排列。一个排列是 N! 元素可以采用的可能排列(其中 N 是范围内的元素数)。不同的排列可以根据它们在字典上相互比较的方式进行排序。代码的复杂度为 O(n*n!),其中还包括打印所有排列。

语法:

代码语言:javascript
复制
模板
bool next_permutation(首先是
双向
迭代器, 最后是 双向迭代器 ); 参数:
first, last : 初始的双向迭代器
和序列的最终位置。范围
used 是 [first, last),其中包含所有元素 
在 first 和 last 之间,包括指向的元素 
by first 但不是 last 指向的元素。

返回值:
true : 如果函数可以重新排列
对象作为字典序更大的排列。
否则,该函数返回 false 以指示 
安排不大于以前, 
但可能是最低的(按升序排序)。

应用:  next_permutation 是为给定的值数组找到下一个字典序更大的值。

例子:

代码语言:javascript
复制
输入:1 2 3 的下一个排列是 
输出:1 3 2

输入:4 6 8 的下一个排列是 
输出:4 8 6
代码语言:javascript
复制
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
    int arr[] = { 1, 2, 3 };

    sort(arr, arr + 3);

    cout << "3!3个元素的可能排列:\n";
    do {
        cout << arr[0] << " " << arr[1] << " " << arr[2] << "\n";
    } while (next_permutation(arr, arr + 3));

    cout << "循环后: " << arr[0] << ' '
        << arr[1] << ' ' << arr[2] << '\n';

    return 0;
}

输出:

代码语言:javascript
复制
3!3个元素的可能排列:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
循环后:1 2 3

std::prev_permutation

它用于将范围 [first, last) 中的元素重新排列为前一个按字典顺序排列的排列。一个排列是 N! 元素可以采用的可能排列(其中 N 是范围内的元素数)。不同的排列可以根据它们在字典上相互比较的方式进行排序。

语法 :

代码语言:javascript
复制
模板
bool prev_permutation(首先是
双向
迭代器, 最后是 双向迭代器 ); 参数:
first, last : 初始的双向迭代器
和序列的最终位置。范围
使用的是 [first, last),其中包含所有
first 和 last 之间的元素,包括 
first 指向的元素但不是元素
最后指出。

返回值:
true : 如果函数可以重新排列
对象作为字典序较小的排列。
否则,该函数返回 false 以指示 
安排不低于以前, 
但最大的可能(按降序排序)。

应用:  prev_permutation 是为给定的值数组找到以前的字典序较小的值。 

例子:

代码语言:javascript
复制
输入:3 2 1的prev排列是 
输出:3 1 2 

输入:8 6 4 的上一个排列是 
输出:8 4 6
代码语言:javascript
复制
#include <algorithm>

#include <iostream>
using namespace std;
int main()
{
    int arr[] = { 1, 2, 3 };

    sort(arr, arr + 3);
    reverse(arr, arr + 3);

    cout << "3!3个元素的可能排列:\n";
    do {
        cout << arr[0] << " " << arr[1] << " " << arr[2] << "\n";
    } while (prev_permutation(arr, arr + 3));

    cout << "循环后: " << arr[0] << ' ' << arr[1]
        << ' ' << arr[2] << '\n';

    return 0;
}

输出:

代码语言:javascript
复制
3!3个元素的可能排列:
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
循环后:3 2 1
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档