STL中,next_permutation( first, last ) 可以把[ first, last)中的序列,变成下一个全排列。
如果序列没有下一个全排列,就返回false,否则返回true。
至于全排列是什么,可以查阅百度百科。(传送门)
而 next_permutation( ) 对我们的序列做了什么呢?
将一个全排列变成下一个全排列的时候,我们可以这样做。
从后往前找,找到一个元素Ai,发现这个元素后面有比他大的元素,其中最小的为Aj。
交换Ai和Aj两个元素的位置,一定可以得到一个比原来大的全排列。
我们要找的下一个,就是比原来全排列只大1的全排列。
我们可以把元素Ai后面的序列排序。
这样,我们就可以得到比原全排列大的所有全排列中最小的那个。
那么就是我们要的,只比原来全排列大1的全排列。
如果找不到这样Ai,就不存在下一个全排列。
而 next_permutation( ) 做的是这样的事。
从后往前找,找到两个相邻的元素 Ai 和 Aii 满足 Ai < Aii。
然后再次从后往前找,找到第一个大于Ai的元素Aj。
交换Ai和Aj的位置,然后讲Aii及Aii后面的元素逆向排列。
我们可以模拟这个过程,发现它的做法和我们的做法差不多,并且更高效。
同时,在STL还有另一个函数 prev_permutation( ),它正好和 next_permutation( ) 相反,是求前一个全排列。
还有要注意的是,当 prev_permutation( ) 和 next_permutation( ) 返回false的时候,序列依然会被改变。
并且会发生回绕,即像 int 一样,最后一个的后面一个,会是第一个,第一个的前面一个会是最后一个。
参考资料:《STL源码剖析》