在 c++ 中使用 next_permutation() stl 的两个数组中的相同排列

Same permutations in two arrays using next_permutation() stl in c++

本文关键字:两个 数组 排列 stl next permutation c++      更新时间:2023-10-16

有没有一种简单的方法可以让next_permutation执行相同的一组交换两个相同大小的不同数组例如如果我有两个数组a[]={1,2,3,4,5}b[]={12,23,21,2,3}如果在排列后数组 A 中的 1 转到第 3 位,则阵列 B 中的 12 也应转到第 3 位。

您可以创建一个辅助索引集:

int a[] = { 1, 2, 3, 4, 5 };
int b[] = { 12, 23, 21, 2, 3 };
std::size_t indices[] = { 0, 1, 2, 3, 4 };

现在对indices执行排列,然后使用 a[indices[i]]b[indices[i]]

请记住

,std::next_permutation 不保留任何状态(这将违背 stl 算法的概念)。那么它是如何生成下一个排列的呢?它按元素的顺序执行此操作。这就是为什么有一个接受比较运算符的版本

如果你给它一个大小为 N 的排序数组,那么next_permutation可以称为 N! 次。否则,在算法返回 false 之前,排列较少。

为了回答您的问题,如果数组在上面建议的"辅助索引集"方面具有相同的顺序,那么相同的元素将被交换。

例:

int a[] = { 1, 2, 4, 3 };
int b[] = { 11, 12, 14, 13 };

它们将排列相同,因为排序将产生相同的索引排序。