std::next_permutation
Defined in header <algorithm>
|
||
template< class BidirectionalIterator > bool next_permutation( BidirectionalIterator first, BidirectionalIterator last ); |
(1) | |
template< class BidirectionalIterator, class Compare > bool next_permutation( BidirectionalIterator first, BidirectionalIterator last, Compare comp ); |
(2) | |
Transforms the range [first, last) into the next permutation from the set of all permutations that are lexicographically ordered with respect to operator< or comp. Returns true if such permutation exists, otherwise transforms the range into the first permutation (as if by std::sort(first, last)) and returns false.
Contents |
[edit] Parameters
first, last | - | the range of elements to permute | |||||||||
comp | - | comparison function which returns true if the first argument is less than the second. The signature of the comparison function should be equivalent to the following:
The signature does not need to have const &, but the function must not modify the objects passed to it. |
[edit] Return value
true if the new permutation is lexicographically greater than the old. false if the last permutation was reached and the range was reset to the first permutation.
[edit] Complexity
At most N/2 swaps, where N = std::distance(first, last).
[edit] Possible implementation
template<class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) { if (first == last) return false; BidirectionalIterator i = last; if (first == --i) return false; while (1) { BidirectionalIterator i1, i2; i1 = i; if (*--i < *i1) { i2 = last; while (!(*i < *--i2)) ; std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i == first) { std::reverse(first, last); return false; } } } |
[edit] Example
The following code prints all three permutations of the string "aba"
#include <algorithm> #include <string> #include <iostream> int main() { std::string s = "aba"; std::sort(s.begin(), s.end()); do { std::cout << s << '\n'; } while(std::next_permutation(s.begin(), s.end())); }
Output:
aab aba baa
[edit] See also
(C++11) |
determines if a sequence is a permutation of another sequence (function template) |
generates the next smaller lexicographic permutation of a range of elements (function template) |