1、next_permutation()会取得[first, last)所标示序列的下一个排列组合,如果没有下一个排列组合,返回false,否则返回true。
2、next_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i < *ii,找到这样一组元素后,再从尾端开始往前找出第一个大于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了下一个组合。
3、next_permutation()源代码
template <class BidirectionalIterator> bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) { if (first == last) return false; //空区间 BidirectionalIterator i = first; ++i; if (i == last) return false; //只有一个元素 i = last;//i指向尾端 --i; for (;;) { BidirectionalIterator ii = i; --i; if (*i < *ii) {//前一个元素小于后一个元素 BidirectionalIterator j = last;//令j指向尾端 while (!(*i < *--j));//由尾端向前找,直到遇上比*i大的元素 iter_swap(i, j);//交换i,j reverse(ii, last);//将ii之后的元素全部逆向重排 return true; } if (i == first) { // 进行至最前面了 reverse(first, last);//全部逆向重排 return false; } } }
4、prev_permutation()会取得[first, last)所标示序列的上一个排列组合,如果没有上一个排列组合,返回false,否则返回true。
5、prev_permutation()函数算法原理:从最尾端开始寻找两个相邻的元素,令第一个元素是*i,第二个元素是*ii,且满足*i > *ii,找到这样一组元素后,再从尾端开始往前找出第一个小于*i的元素*j,将i、j元素对调,然后将ii之后的所有元素逆序排列,就得到了上一个组合。
6、prev_permutation()源代码
template <class BidirectionalIterator> bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last) { if (first == last) return false; //空区间 BidirectionalIterator i = first; ++i; if (i == last) return false; //只有一个元素 i = last;//i指向尾端 --i; for (;;) { BidirectionalIterator ii = i; --i; if (*ii < *i) {//后一个元素小于前一个元素 BidirectionalIterator j = last;//令j指向尾端 while (!(*--j < *i));//由尾端向前找,直到遇上比*i小的元素 iter_swap(i, j);//交换i,j reverse(ii, last); // 将ii之后的元素全部逆向重排 return true; } if (i == first) { // 进行至最前面了 reverse(first, last);//全部逆向重排 return false; } } }