使用algorithm頭文件,需要在頭文件加using namespace std;
1、常見的函數(max(),min(),abs(),swap())
int x=98;
int y=7;
int z=12;
printf("%d %d\n",max(x,y),min(y,z));///求最小值和最大值
swap(x,y);///交換x,y的值
int r=-1;
printf("%d\n",abs(r));///求數的絕對值
2、reverse()、next_permutation()、fill()、sort()
(1)reverse(it,it2):可以將數組指針在(it,it2)之間的遠足或容器的迭代器在[it,it2)範圍內的元素進行反轉。
///a爲數組
reverse(a,a+4);///反轉a[0]~a[3]的元素
///str爲字符串數組
reverse(str.begin()+1,str.begin()+5);///反轉str[1]~str[4]的元素
(2)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));
//1 2 3
//1 3 2
//2 1 3
//2 3 1
//3 1 2
//3 2 1
相反地,perv_permutation():按照字典降序的方式生成的排列(運用此函數前,序列要先從大到小排序)
int a[10]={3,2,1};///從大到小排序
do{
printf("%d %d %d\n",a[0],a[1],a[2]);
}while(prev_permutation(a,a+3));
(3)fill():可以把數組或容器中的某一段區間賦爲某個相同的值。和memset不同,這裏的賦值可以是數組類型對應範圍中的任意值。
fill(a,a+3,5);///將a[0]~a[2]均賦值爲5
(4)sort():用來排序的函數
(1)基本數據類型的數組排序
///a爲數組
sort(a,a+4);///默認升序排序
sort(a,a+4,less<數據類型>());///升序排序
sort(a,a+4,greater<數據類型>())///降序排序
(2)自定義cmp函數排序
#include <algorithm>
#include <iostream>
#include<stdio.h>
using namespace std;
bool cmp(int a,int b){
return a<b;///從小到大,如果是a>b就是從大到小
}
int main()
{
int a[4]={3,2,1,7};
sort(a,a+4,cmp);
for(int i=0;i<4;i++)
printf("%d\n",a[i]);
return 0;
}
(3)結構體數組
struct node{
int x,y;
}arr[10];
bool cmp(node a,node b){
return a.x>b.x;///x從大到小排序
}
bool cmp(node a,node b){
if(a.x!=b.x) return a.x>b.x;
else return a.y<b.y;///當x相等的情況下
}
(4)容器的排序
在STL標準容器中,只有vector、string、deque是可以使用sort,像set、map這種容器用紅黑樹實現的,元素本身有序,故不允許使用sort排序。
例如(vector):
bool cmp(int a,int b){
return a>b;
}
vector<int>a;
sort(a.begin(),a.end(),cmp);
3、lower_bound和upper_bound()
它們都需要用在一個有序數組或容器中。
lower_bound(first,last,val):用來尋找在數組或容器的[first,last)範圍內第一個值>=val的元素的位置,如果數組,則返回該位置的指針;如果是容器,則返回該位置的迭代器。
upper_bound(first,last,val):用來尋找在數組或容器的[first,last)範圍內第一個值>val的元素的位置,如果數組,則返回該位置的指針;如果是容器,則返回該位置的迭代器。
int a[4]={1,2,3,4};
int *lowerpos = lower_bound(a+1,a+4,2);///>=1,位置從下標爲1開始
int *upperpos = upper_bound(a+1,a+4,2);///>1也就是在這個範圍內於元素不存在,返回位置
printf("%d %d\n",lowerpos-a,upperpos-a);///1(下標),2(位置)