```
template<class BidirectionalIterator>
bool next_permutation(BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
bool next_permutation(BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
```

*Effects:*
Takes a sequence defined by the range
[first,last)
and transforms it into the next permutation.
The next permutation is found by assuming that the set of all permutations is
lexicographically sorted with respect to
operator<
or comp.
If such a permutation exists, it returns
true.
Otherwise, it transforms the sequence into the smallest permutation,
that is, the ascendingly sorted one, and returns
false.

*Requires:*
BidirectionalIterator shall satisfy the requirements of
ValueSwappable ([swappable.requirements]).

*Complexity:*
At most
(last - first)/2
swaps.

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

*Effects:*
Takes a sequence defined by the range
[first,last)
and transforms it into the previous permutation.
The previous permutation is found by assuming that the set of all permutations is
lexicographically sorted with respect to
operator<
or comp.

*Returns:*
true
if such a permutation exists.
Otherwise, it transforms the sequence into the largest permutation,
that is, the descendingly sorted one, and returns
false.

*Requires:*
BidirectionalIterator shall satisfy the requirements of
ValueSwappable ([swappable.requirements]).

*Complexity:*
At most
(last - first)/2
swaps.