一些好用的函数
前言:本篇主要简单记录一些平时遇到的好用的或者性能很特别的函数,持续更新中
1.关于全排列
(1)next_permutation()
头文件:
#include <algorithm>
函数原型:
bool next_permutation(iterator begin,iterator end)
用来求全排列的下一项(按字典序)
例:对于以下代码:
char ch[5]={
'a','d','b','e','c'};
next_permutation(ch,ch+5);
cout << ch[0] << ch[1] << ch[2] << ch[3] << ch[4] << endl;
输出结果为:
adcbe
需要注意的是,这个函数返回值类型是 b o o l bool bool,当数组已经完全倒序时,函数会返回 f a l s e false false,根据这一原理,我们可以利用一个do-while
循环,对一个按字典序排列好的数组进行全排列的遍历:
char ch[3]={
'a','b','c'};
do{
cout << ch[0] << ch[1] << ch[2] << endl;
}while(next_permutation(ch,ch+3));
注意这里一定要用do-while
,否则不会有原先的排列顺序
输出结果为:
abc
acb
bac
bca
cab
cba
(2)prev_permutation()
头文件:
#include <algorithm>
函数原型:
bool prev_permutation(iterator begin,iterator end)
用来求全排列的上一项(按字典序)
与上面的next_permutation()
类似,对于以下代码:
char ch[5]={
'a','d','b','e','c'};
prev_permutation(ch,ch+5);
cout << ch[0] << ch[1] << ch[2] << ch[3] << ch[4] << endl;
输出结果为:
adbce
同理,当数组已经完全正序时,函数会返回 f a l s e false false,我们同样可以利用一个do-while
循环,对一个完全倒序的数组进行全排列的遍历:
char ch[3]={
'c','b','a'};
do{
cout << ch[0] << ch[1] << ch[2] << endl;
}while(prev_permutation(ch,ch+3));
输出结果为:
cba
cab
bca
bac
acb
abc
2.关于二分查找
(1)lower_bound()
头文件:
#include <algorithm>
函数原型:
iterator lower_bound(iterator begin,iterator end,const T& val);
用来求单调不减序列 [ b e g i n , e n d ) [begin,end) [begin,end)中第一个数值 ≥ v a l \geq val ≥val的迭代器,其中传入的参数 b e g i n begin begin和 e n d end end分别为序列开头和末尾的迭代器,特别地,如果序列中所有数值都 < v a l < val <val,则会返回数组中下标为 e n d end end的迭代器
例:对于以下代码
int a[5]={
1,3,5,7,9};
cout << (lower_bound(a,a+5,1)-a) << " ";
cout << (lower_bound(a,a+5,2)-a) << " ";
cout << (lower_bound(a,a+3,8)-a) << " ";
cout << (lower_bound(a,a+5,10)-a) << endl;
输出结果为:
0 1 3 5
需要注意的是,这个函数内部实现利用了二分查找的原理,时间复杂度为 O ( log n ) O(\log n) O(<