algorithm头文件下的常用函数
使用algorithm头文件,需要在头文件下加一行“using namespace std;”才能正常使用。
一.max()、min()、abs()
1)max(x,y)和min(x,y)分别返回x和y的最大值和最小值,且参数必须是两个(可以时浮点 数)。如果想返回三个数x、y、z的最大值,可以使用max(x,max(x,y));
2)abs(x)返回x的绝对值。注意:x必须是证书,浮点数的绝对值请使用math头文件下的fabs。
二、swap(x,y)用来交换x和y的值*
int x=1,y=2;
swap(x,y);
printf("%d %d\n",x,y);//2 1
三、reverse(it,it2);可以将数组指针在[it,it2)之间的元素或容器的迭代器在[it,it2)范围内的元素进行反转。
int a[10]={10,11,12,13,14,15};
reverse(a,a+4);//将a[0]~a[3]反转
for(int i=0;i<6;i++)
{
printf("%d",a[i]);//13、12、11、10、14、15
}
如果是对容器中的 元素(例如string字符串)进行反转,结果也一样。
string str="abcdefghi";
reverse(str.begin()+2,str.begin()+6);//abfedcghi
四、next_permutation()给出一个序列在全排列中的下一个序列。
int a[10]={1,2,3};
do{
printf("%d%d%d\n",a[0],a[1],a[2]);
}while(next_permutation(a,a+3));
输出结果:
123
132
213
231
312
321
五、fill()可以把数组或容器中的某一段区间赋为某个相同的值。和memset不同,这里的赋值可以时数组类型对应范围中的任意值。
int a[5]={1,2,3,4,5};
fill(a,a+5,233);//233 233 233 233 233
六、sort()
1.如何使用sort排序
sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
如果不写比较函数,则默认对前面给出的区间进行递增排序。
int a[6]={9,4,2,5,6,-1};
//将a[0]~a[3]从小到大排序
sort(a,a+4);//2 4 5 9 6 -1
sort(a,a+6)://-1 2 4 5 6 9
2.如何实现比较函数cmp
如果想要从大到小来排序,则要使用比较函数cmp来告诉sort合适要交换元素。
bool cmp(int a,int b)
{
return a>b;//可以理解为当a>b时把a放在b前面
}
七、lower_bound(()和upper_bound()
两个函数需要用在一个有序数组或容器中。
1) lower_bound(first,last,val)用来寻找数组或容器的[first,last)范围中第一个大于等于val的元素的位置,如果是数组,则返回该位置的指针;如果是容器,则返回该文之的迭代器。
2) upper_bound(first,last,val)用来寻找数组或容器的[first,last)范围中第一个大于val的元素的位置,如果是数组,则返回该位置的指针;如果是容器,则返回该文之的迭代器。
int a[10]={1,2,2,3,3,3,5,5,5,5};
int* lowerpos=lower_bound(a,a+10,3);
int* upperpos=lower_bound(a,a+10,3);
printf("%d, %d\n",lowerpos-a,upperpos-a);//3, 6
注意:这里直接令返回值减去数据首地址就可获得预查元素的下标。