2011-12-27 14 views
2

次のプログラムには1つの置換エントリがありません。それは一つのエントリが欠落している理由std :: next_permutationに1つのエントリがありません

#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

その順列は、リストの最初の発注があるためでありますあなたが持っている番号の 元の配列をソートする必要があります。この順列は、最初のものとしてリストされます。

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()); 

代わりに、あなただけのソート順で要素をプッシュすることができますが、あなたはすべての可能な順列を生成する場合は実用的な目的のために、あなたは常に並べ替える必要があります。

+0

もう1つの方法は、適切な数式を使用する必要がある置換の数を計算してから、それを何度も繰り返し、next_permutationからの戻り値を無視することです。 –

+0

既にソートされていれば、コンテナをソートしないでください。 – wilhelmtell

+1

@ KarlKnechtel整数のオーバーフローのため、おそらくそれほど簡単ではありません。 – wilhelmtell

1

実際には、2 10 4 42 4 10 44 4 10 2などの他の有効な順列が欠落しています。それは言う、右が文書で:

彼らが欠落している理由として

戻り値 true機能は、辞書順で大きい順列としてオブジェクトを並べ替えることができれば。それ以外の場合、この関数は、配列が前のものよりも大きくなく、可能な限り小さい(昇順でソートされている)ことを示すためにfalseを返します。

それが辞書の最大の順列(あなたは左から右へ、降順でだ、すなわち1それらを比較するとき、「最大」だ1)であるので、それでwhileループは、10 4 4 2後に終了します。それを印刷した後、next_permutationは '次の'順列に到達せず、2 4 4 10という "最初の"順列にラップアラウンドします。関数がfalseを返したために出力されません。

関連する問題