c++STL中的全排列函数next_permutation详解

news/2024/7/7 20:40:22 标签: c++, STL, 开发语言

STLnext_permutation_0">c++STL中的全排列函数next_permutation详解

在 C++ 的 库中,next_permutation 是一个用于计算给定范围内元素的下一个排列的函数。这个函数特别适用于对整数序列或可以比较的元素进行全排列的生成。

参数

first, last:表示范围的迭代器,即要重新排列的序列的开始和结束。
cmp(可选):一个自定义的比较函数或函数对象,用于确定元素之间的顺序。

返回值

如果存在下一个排列,则返回 true 并重新排列序列。如果不存在下一个排列(即序列已经是最大排列),则函数将序列重置为最小排列并返回 false。

使用示例1(没有cmp)

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3};

    // 打印所有排列
    do {
        for (int n : v) {
            std::cout << n << ' ';
        }
        std::cout << '\n';
    } while (std::next_permutation(v.begin(), v.end()));

    return 0;
}

使用示例2(有cmp)

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional> // 对于std::greater

int main() {
    std::vector<int> v = {3, 2, 1};

    // 使用std::greater作为比较函数对象,它将产生降序排列
    do {
        for (int n : v) {
            std::cout << n << ' ';
        }
        std::cout << '\n';
    } while (std::next_permutation(v.begin(), v.end(), std::greater()));

    // 注意:由于我们使用了std::greater,所以排列将是降序的,
    // 当没有更多降序排列时,它将重置为最大降序排列(即最小升序排列)
    return 0;
}

使用示例3(结构体全排列—必须要有全排列函数)

#include<iostream>
#include<algorithm>//使用 next_permutation()和sort()需要导入的头文件 
using namespace std;

struct test{//结构体test 
 int val;
}; 

bool cmp(test t1,test t2){//自定义的排列 
 return t1.val<t2.val;
}

int main(){
 test t[4];//结构体数组 
 t[0].val=1;
 t[1].val=2;
 t[2].val=3;
 t[3].val=4;
 
 do{
  for(int i=0;i<4;i++){//打印排列 
   cout<<t[i].val<<' ';
  }
  cout<<endl;
 }while(next_permutation(t,t+4,cmp));//获取下一个排列 
} 

注意事项

next_permutation 假定序列中的元素是唯一的(即没有重复)。如果有重复元素,并且你希望考虑所有可能的排列(包括重复的),那么你需要使用其他方法或库。
next_permutation 是原地(in-place)算法,即它会修改传入的序列。
如果传入的序列已经是最大排列(即按字典序排序),那么 next_permutation 会将其重置为最小排列。
如果你需要生成所有排列,并希望它们按字典序排序,那么可以使用 do-while 循环,如上面的示例所示。
如果你只想检查是否存在下一个排列,而不需要实际生成它,那么可以检查 next_permutation 的返回值。


http://www.niftyadmin.cn/n/5535288.html

相关文章

微服务之服务保护策略【持续更新】

文章目录 线程隔离一、滑动窗口算法二、漏桶算法三、令牌桶算法 面试题1、Sentinel 限流和Gateway限流的区别 线程隔离 两种实现方式 线程池隔离&#xff08;Hystix隔离&#xff09;&#xff0c;每个被隔离的业务都要创建一个独立的线程池&#xff0c;线程过多会带来额外的CPU…

深度解析华为仓颉语言

什么是华为仓颉语言&#xff1f; 华为仓颉语言&#xff08;Huawei Cangjie Language&#xff0c;HCL&#xff09;是华为公司推出的一种新型编程语言&#xff0c;旨在解决大规模分布式系统开发中的复杂性问题。仓颉语言以高效、简洁和易用为设计目标&#xff0c;特别适用于云计…

6 矩阵相关案例

矩阵计算在CUDA中的应用是并行计算领域的典型场景 &#xff1b; 矩阵算法题通常涉及线性代数的基础知识&#xff0c;以及对数据结构和算法的深入理解。解决这类问题时&#xff0c;掌握一些核心思想和技巧会非常有帮助。以下是一些常见的矩阵算法题解题思想&#xff1a; 动态规划…

Linux和mysql中的基础知识

cpu读取的指令大部分在内存中&#xff08;不考虑缓存&#xff09; 任何程序在运行之前都的加入到内存。 eip->pc指针&#xff0c;指明当前指令在什么位置。 代码大概率是从上往下执行的&#xff0c;基于这样的基本理论。既可以将一部分指令加载到CPU对应的缓存中&#xf…

一文带你入门机器学习回归算法

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

mongdb学习与使用

1. 基础概念 MongoDB简介&#xff1a; MongoDB是一个基于文档的NoSQL数据库&#xff0c;具有高性能、高可用性和易扩展性。数据存储在类似JSON的BSON格式中。 基本术语&#xff1a; Database&#xff08;数据库&#xff09;&#xff1a; 集合的容器。Collection&#xff08;集合…

Echarts折线+柱状图的多y轴

实现效果&#xff1a; 代码&#xff1a; <template><div class"test-echart"><div id"barLineChart" ref"barLineChart" :style"barLineStyle"></div></div> </template> <script> // imp…

Hutool构建树结构

引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version> </dependency>测试 SpringBootTest public class HutoolTest {private List<Menu> me…