Category: algorithms | Component type: function |
template <class BidirectionalIterator> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last); template <class BidirectionalIterator, class StrictWeakOrdering> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, StrictWeakOrdering comp);
The postcondition is that the new permutation of elements is lexicographically less than the old (as determined by lexicographical_compare) if and only if the return value is true.
The two versions of prev_permutation differ in how they define whether one element is less than another. The first version compares objects using operator<, and the second compares objects using a function object comp.
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; }
[1] If all of the elements in [first, last) are distinct from each other, then there are exactly N! permutations. If some elements are the same as each other, though, then there are fewer. There are, for example, only three (3!/2!) permutations of the elements 1 1 2.
[2] Note that the lexicographically greatest permutation is, by definition, sorted in nonascending order.