2014-01-19 2 views
2

문자열의 벡터에 대한 모든 순열을 인쇄하려고합니다.문자열의 벡터의 next_permutation이 하나의 순열을 건너 뜁니다.

#include<iostream> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main() { 
    vector<string> v; 

    v.push_back("+1"); 
    v.push_back("x4"); 

    do { 
     cout << v[0] << " " << v[1] << endl; 
    } while (next_permutation(v.begin(), v.end())); 
} 

출력 :

+1 x4 
x4 +1 

을하지만 "* 4"를 next_pemutation 루프 반복을 위해 한 번만 "X4"를 변경할 때이 코드는 의도 한대로 작동합니다.

#include<iostream> 
#include<vector> 
#include<algorithm> 

using namespace std; 

int main() { 
    vector<string> v; 

    v.push_back("+1"); 
    v.push_back("*4"); 

    do { 
     cout << v[0] << " " << v[1] << endl; 
    } while (next_permutation(v.begin(), v.end())); 
} 

출력 : # 같은

+1 *4 

다른 문자는 같은 효과를 갖고있는 것 같아요. 왜 그런가?

"+1" < "x4" ('+' < 'x') :

+10

그것은 그들 모두를 통해 갈 정렬을 시작해야합니다. – chris

+0

"다음"은 "모든 순열의 특정 순서에서 다음"을 의미합니다. –

+1

실제로 [설명서] (http://en.cppreference.com/w/cpp/algorithm/next_permutation)의 어느 부분을 이해할 수 없는지 먼저 설명해 주시면 유용한 답변을 드릴 수 있습니다. –

답변

3

귀하의 알고리즘은 모든 순열을 인쇄 할 분류 vector 시작해야합니다 그래서 당신은 정말 "첫 번째"순열로 시작합니다.
"+1" > "*4" ('+' > '*') : 따라서 첫 번째 순열로 시작하지 마십시오.

주문하는 사람 ascii 또는 을 참조하십시오.

이 문제를 해결하기 위해, 당신은 마지막 push_back 후에 할 수 있습니다

std::sort(v.begin(), v.end());