c++ STL算法与应用(一) 字典序列与全排列

       在数据结构中,所谓的字典序列其实很简单;就是元素根据英文字母的顺序排列,就叫字典序列;比列{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;
}

        输出结果如下

    如果起始序列不是一个字典升序列或降序列的话,得到的就不是全排列了。

猜你喜欢

转载自blog.csdn.net/wanghualin033/article/details/81415473