以下程序缺少一个排列条目。
#include <iostream>
#include <vector>
#include <algorithm>
int main ( int argc, char **argv) {
std::vector<int> temp;
temp.push_back(10);
temp.push_back(2);
temp.push_back(4);
temp.push_back(4);
do {
std::copy(temp.begin(),temp.end(),std::ostream_iterator<int>(std::cout," "));
std::cout << std::endl;
}while ( std::next_permutation (temp.begin(), temp.end()));
}
以下是程序的输出
10 2 4 4
10 4 2 4
10 4 4 2
为什么缺少一个
的条目 2 4 4 10
答案 0 :(得分:2)
这是因为排列是您拥有的数字列表的第一个排序。 您需要对原始数组进行排序,然后将这个排列列为第一个。
std::vector<int> temp;
temp.push_back(10);
temp.push_back(2);
temp.push_back(4);
temp.push_back(4);
std::sort(temp.begin(),temp.end() );
或者,您可以按排序顺序推送元素,但出于实际目的,如果要生成所有可能的排列,则应始终排序。
答案 1 :(得分:1)
它实际上缺少其他一些有效的排列:例如2 10 4 4
和2 4 10 4
以及4 4 10 2
。
至于他们失踪的原因:它说,就在文档中:
返回值
true
如果函数可以将对象重新排列为按字典顺序排列更大的排列。否则,该函数返回false以指示排列不大于前一个,但最低可能(按升序排序)。
因此while
循环在10 4 4 2
之后结束,因为这是按字典顺序排列最大的排列(从左到右比较它们时的“最大”排列,即按降序排列的排列)。打印完一个后,next_permutation无法进入“下一个”排列,并绕过2 4 4 10
的“开始”排列;但是没有打印,因为该函数也返回false。