在数据结构中,所谓的字典序列其实很简单;就是元素根据英文字母的顺序排列,就叫字典序列;比列{a,b,c}就是一个字典序列;
对于集合在数据结构中我们用std::set来管理和使用它,需要注意的是集合中不能有相同元素,就和高数一样的。所以std::set中的元素必须有"<"的重载或者能够比较大小的函数对象。
比如像{1,2,3,4}这样的一个集合,排列顺序的话有4*3*2*1=24种情况;在c++中已经有现成的std::next_permutation算法可以实现了。它用来生成一个序列的下一个序列;下一个序列是什么意思呢?
std::set容器中字典序列是一个没有上一个序列的序列,意思就是起始端,元素都是像字母大小顺序一样从左往右排的升序排列;最后一个序列则是每个元素都是探幽字母的降序排列,没有下一个排列了。中间的那些排列就都是一步步的向最后一个排列过渡了。
由于{1,2,3,4}是字典序列,所以要生成全排列,我们可以起一个循环,一直取它的下一个序列,直到没有下一个序列为止。
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> range{ 1,2,3,4 };
int count = 0;
do {
std::copy(range.begin(), range.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "count " << ++count << std::endl;
} while (std::next_permutation(range.begin(),range.end())); //没有下一个序列时,会返回false
return 0;
}
输出结果如下
同时,STL也提供了前一个序列,意思和上面相反了;如果要得到它的全排列,我们可以这样
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
int main()
{
std::vector<int> range{ 4,3,2,1 };
int count = 0;
do {
std::copy(range.begin(), range.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << "count " << ++count << std::endl;
} while (std::prev_permutation(range.begin(),range.end())); //没有上一个排列返回false
return 0;
}
输出结果如下
如果起始序列不是一个字典升序列或降序列的话,得到的就不是全排列了。