将 std::next_permutation 与 2D 数组一起使用

Posted

技术标签:

【中文标题】将 std::next_permutation 与 2D 数组一起使用【英文标题】:use std::next_permutation with 2D Array 【发布时间】:2016-03-22 09:52:03 【问题描述】:

我想打印数组AAA 的所有排列。我无法弄清楚函数std::next_permutation的第二个参数?

#include <algorithm>

char AAA[4][4] = "abc","123","ABC"; 

do

    printf("%s %s %d\n",AAA[0],AAA[1],AAA[2]);

   while( std::next_permutation( AAA, ???? ));

应该是&amp;AAA[3] 还是别的什么?

【问题讨论】:

char*,你会比较地址,用std::string AAA[]代替。 顺便说一句,在 ascii 中,'1' &lt; 'A''A' &lt; 'a',因此您应该初始化为 "123", "ABC", "abc" 以迭代所有排列。 不是真的,Jarod42。由于排序顺序是基于比较地址,而不是指向的数据,这实际上将循环所有迭代。虽然,诚然,这可能比 OP 的良好计划更幸运 - 使用 std::string 的数组(或容器)需要首先排序,因为排序顺序基于字符串中的数据,而不是它们的地址。 【参考方案1】:

应该是

 while( std::next_permutation( std::begin(AAA), std::end(AAA)));

或者(更简单地说,如果你知道 AAA 正好有 4 元素)

 while( std::next_permutation( AAA, AAA + 4));

建议AAAstd::stringstd::vector&lt;std::string&gt; 的数组,但如果循环要遍历所有排列,则需要排序。

如果您使用std::cout 流式输出,而不是使用printf(),它会让 C++ 人少一些畏缩。

【讨论】:

以上是关于将 std::next_permutation 与 2D 数组一起使用的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL应用与实现62: 如何使用std::next_permutation

std::next_permutation 实现说明

为啥 std::next_permutation 会跳过一些排列?

C++ 全排列函数 nyoj 366

全排列permutation

通过重复生成所有排列