SGI

prev_permutation

类别:算法 组件类型:函数

原型

Prev_permutation是重载名称;实际上有两个prev_permutation函数。
template <class BidirectionalIterator>
bool prev_permutation(BidirectionalIterator first,
                      BidirectionalIterator last);

template <class BidirectionalIterator, class StrictWeakOrdering>
bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last,
                      StrictWeakOrdering comp);

说明

Prev_permutation将元素范围[first, last)转换成元素在字典序中下一个较小的排列。不同排列的数量是有限的(最多N! [1],其中Nlast - first),因此,如果排列按lexicographical_compare进行排序,则对于哪种排列在字典序中较前存在明确的定义。如果存在此类排列,prev_permutation就会转换[first, last)成该排列并返回true。否则它会转换[first, last)成字典序中最大的排列 [2] 并返回false.

后置条件是元素的新排列在字典序中比旧排列小(由lexicographical_compare决定),当且仅当返回值为true.

这两个版本的prev_permutation在定义一个元素是否小于另一个元素时有所不同。第一个版本使用operator<比较对象,第二个版本使用 函数对象comp.

比较对象

定义

在标准头文件 algorithm 中定义,在向后兼容非标准头文件 algo.h 中定义。

对类型的要求的值类型的排序关系是严格弱序,如 可小于比较 要求中所定义。

的参数类型。

是一个有效的范围。

复杂度线性。最多(last - first) / 2

次交换。

int main()
{
  int A[] = {2, 3, 4, 5, 6, 1};
  const int N = sizeof(A) / sizeof(int);

  cout << "Initially:              ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;

  prev_permutation(A, A+N);
  cout << "After prev_permutation: ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;

  next_permutation(A, A+N);
  cout << "After next_permutation: ";
  copy(A, A+N, ostream_iterator<int>(cout, " "));
  cout << endl;
}

示例

备注[first, last)[1] 如果N!中的所有元素彼此不同,那么恰好有3!/2!个排列。不过,如果某些元素与其他元素相同,那么排列会更少。例如,元素1 1 2.

只有三个(

)排列。

[2] 请注意,字典序中最大的排列在定义中是按非升序排列的。, lexicographical_compare另请参见next_permutation
[Silicon Surf] [STL Home]
可小于比较严格弱序 sort