函式模板
<algorithm>

std::prev_permutation

預設 (1)
template <class BidirectionalIterator>  bool prev_permutation (BidirectionalIterator first,                         BidirectionalIterator last );
自定義 (2)
template <class BidirectionalIterator, class Compare>  bool prev_permutation (BidirectionalIterator first,                         BidirectionalIterator last, Compare comp);
將範圍轉換為前一個排列
將範圍 [first,last) 中的元素重新排列成前一個字典序排列。

一個排列是元素可以採取的 N! 種可能排列中的每一種(其中 N 是範圍中的元素數量)。不同的排列可以根據它們字典序的比較方式進行排序;第一個這種排序的可能排列(將與所有其他排列進行字典序比較更小的排列)是其所有元素按升序排序的排列,而最大的排列是其所有元素按降序排序的排列。

元素之間的比較是使用第一個版本的 operator< 或第二個版本的 comp 進行的。

如果函式能夠確定前一個排列,它將元素重新排列成這樣並返回 true。如果不可能(因為它已處於最低可能排列),它將元素重新排列成最後一個排列(按降序排序)並返回 false

引數

first, last
雙向迭代器 指向序列的初始和最終位置。使用的範圍是 [first,last),它包含 firstlast 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
BidirectionalIterator 應指向一個型別,該型別已正確定義了 swap
comp
二元函式,接受由 BidirectionalIterator 指向的型別的兩個引數,並返回一個可轉換為 bool 的值。返回的值指示第一個引數在它定義的特定嚴格弱序中是否被認為排在第二個引數之前。
該函式不得修改其任何引數。
這可以是指標,也可以是函式物件。

返回值

如果函式能夠將物件重排為字典序更小的排列,則返回 true
否則,函式返回 false,表示該排列不小於前一個,而是最大的可能排列(按降序排序)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// next_permutation example
#include <iostream>     // std::cout
#include <algorithm>    // std::next_permutation, std::sort, std::reverse

int main () {
  int myints[] = {1,2,3};

  std::sort (myints,myints+3);
  std::reverse (myints,myints+3);

  std::cout << "The 3! possible permutations with 3 elements:\n";
  do {
    std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
  } while ( std::prev_permutation(myints,myints+3) );

  std::cout << "After loop: " << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';

  return 0;
}

輸出
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
After loop: 3 2 1


複雜度

最多線性於 firstlast 之間距離的一半(以實際交換次數計)。

資料競爭

範圍[first,last)內的物件將被修改。

異常

如果任何元素交換引發異常,或者任何迭代器操作引發異常,則丟擲異常。
請注意,無效引數會導致未定義行為

另見