2010-06-29 23 views
2

爲什麼這個代碼備註工作(代碼編譯和運行良好,但實際上並沒有顯示排列):C++ <algorithm>排列

int main(int argc, char *argv[]) 
{ 
    long number; 
    vector<long> interval; 
    vector<long>::const_iterator it; 

    cout << "Enter number: "; 
    cin >> number; 

    while(number-->0){ 
     interval.push_back(number); 
    } 

    do{ 
     for(it = interval.begin(); it < interval.end(); ++it){ 
      cout << *it << " "; 
     } 
     cout << endl; 
    } while(next_permutation(interval.begin(), interval.end())); 

    return (0); 
} 

但改變這一行後:

while(next_permutation(interval.begin(), interval.end())); 

與:

while(prev_permutation(interval.begin(), interval.end())); 

是不是排列通過作用於位置來改變向量中的元素?

PS: 我已經編輯了代碼。

+1

您發佈了兩次相同的行(用示例更改此行)以及什麼是prev_permutation? – RvdK 2010-06-29 14:57:43

+0

http://www.cplusplus.com/reference/algorithm/prev_permutation/ – 2010-06-29 15:00:34

+1

'prev_permutation'在STL''中。 – 2010-06-29 15:03:54

回答

7

排列是字典順序,這就是std::next_permutationstd::prev_permutation算法遍歷。

在這裏你輸入「最大」的排列,所以沒有下一個順序。

+0

我現在明白了。所以如果我想要生成所有的排列,我需要將所有的數字排序。謝謝! – 2010-06-29 15:11:43

+0

確切地說:排序,然後使用next_permutation。或者,反向排序,然後使用prev_permutation。 – rturrado 2010-06-29 15:16:02

+0

@Andrie:或者只是在不需要排序的情況下運行prev和next。 – 2010-06-29 16:08:46

1

我不認爲next_permutation可以在職位上工作(它將在哪裏存儲信息?)。您需要能夠比較next_permutation的元素才能工作,這就是它用來生成字典順序下一個排列的原因。

嘗試以相反的順序插入數字,看看是否有效。

+0

是的,插入是通過以相反的順序插入數字來工作的。 – 2010-06-29 15:12:11

3

排列不是通過作用於位置來改變向量中的元素嗎?

next_permutation使用元素的排序來確定下一個排列。例如,如果A < B < C,則[A,B,C](012)的next_permutation將是[A,C,B](021)。然而,如果A,B,C](021)的next_permutation將是[C,A,B](102)。

由於您的向量最初是按照遞減順序排列的,因此它將是最後的置換。

您可以使用std::greater排序來反轉比較方向。

} while(next_permutation(interval.begin(), interval.end(), greater<long>())); 
//               ^^^^^^^^^^^^^^^