std :: next_permutation缺少一个条目

时间:2011-12-27 06:48:41

标签: c++ stl

以下程序缺少一个排列条目。

#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

2 个答案:

答案 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 42 4 10 4以及4 4 10 2

至于他们失踪的原因:它说,就在文档中:

  

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

因此while循环在10 4 4 2之后结束,因为这是按字典顺序排列最大的排列(从左到右比较它们时的“最大”排列,即按降序排列的排列)。打印完一个后,next_permutation无法进入“下一个”排列,并绕过2 4 4 10的“开始”排列;但是没有打印,因为该函数也返回false。