该函数为C++中的函数模板,用于生成数组的全排列。
default (1) |
template <class BidirectionalIterator> bool next_permutation (BidirectionalIterator first, BidirectionalIterator last); |
---|---|
custom (2) |
template <class BidirectionalIterator, class Compare> bool next_permutation (BidirectionalIterator first, BidirectionalIterator last, Compare comp); |
将BidirectionalIterator中的[first,last]进行重新排序,若有N个元素,则共有N!个结果。
默认参数 (first,last)为BidirectionalIterator的边界,自定义用法中,增加comp参数,为自己定义的排序方法或规则,类似于vector的std::sort()排序。
实现方法:
template<class BidirIt>
bool next_permutation(BidirIt first, BidirIt last)
{
if (first == last) return false;
BidirIt i = last;
if (first == --i) return false;
while (true) {
BidirIt 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;
}
}
}
用例:
#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