using namespace std;
”才能正常使用。
max(x,y)和min(x,y)分别返回x和y中的最大值和最小值,且参数必须是两个(可以是浮点数)。如果想要返回三个数xyz中的最大值,可以使用max(x,max(y,z))的写法 。
abs(x)返回x的绝对值。注意x必须为整数,如果求浮点型的绝对值用math头文件下的fabs。
swap(x,y)可以用来交换x和y的值。
reverse(it,it2)可以将数组指针在[it,it2)之间的元素或容器的迭代器在区间范围内反转。
给出一个序列在全排列中的下一个序列。
例如:当n=3时的全排列为:123,132,213,231,312,321,这样231的下一个排列是312。
#include
using namespace std;
int main(){
int a[10] = {1,2,3};
//a[0]~a[2]之间的序列需要求解next_permutation()
do{
printf("%d%d%d\n",a[0],a[1],a[2]);
}while(next_permutation(a,a+3));
return 0;
}
输出结果:
123
132
213
231
312
321
在上述代码中,next_permutaiton()在已经到达全排列的最后一个时会返回false,这样会方便退出循环。
fill()可以把数组或容器的某一段区间赋为某个相同的值,和memset不同,这里的赋值可以为任何值。
sort()是用来排序的函数。
使用方式如下:
sort(首地址元素(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
如果不写比较函数,默认进行递增排序。
int main(){
int a[6] = {9,4,2,5,6,-1};
//将a[0]~a[3]从小到大排序
sort(a,a+4);
//将a[0]~a[5]从小到大排序
sort(a,a+6);
}
同样可对char数组排序,按字典序。
比较函数不填,默认从小到大排序。如果想要从大到小排序,则要使用比较函数cmp来实现:
bool cmp(int a, int b){//int类型可以更改
return a > b;//可以理解为当a>b时把a放在b前面
}
sort(a,a+n,cmp);
现在定义了如下的结构体:
struct node{
int x,y;
}ssd[10];
如果想将ssd数组按x从大到小排序:
bool cmp(node a,node b){
return a.x > b.x;
}
如果想按x从大到小排序,同时如果x相同就按y的大小从小到大来排序(二级排序):
bool cmp(node a, node b){
if(a.x == b.x) return a.y<b.y;
else return a.x > b.x;
};
在STL容器里,只有vector、string、deque是可以使用sort的。因为set、map这种容器本身就有序。
bool cmp(int a,int b){
return a>b; //由于vector中的元素是int,因此依旧是int的比较
}
vector<int> vi;
vi.push_back(3);
vi.push_back(1);
vi.push_back(2);
sort(vi.begin(),vi.end(),cmp);
如果按照字符串长度从小到大排序:
bool cmp(string str1, string str2){
return str1.length() < str2.length();
}
lower_bound()和upper_bound()需要用在一个有序数组或容器里。
lower_bound(first,last,val)用来寻找在数组或容器的[first,last)范围内第一个值大于等于val的元素的位置,如果是数组,返回该位置的指针;如果是容器,返回该位置的迭代器。
upper_bound(first,last,val)用来寻找在数组或容器的[first,last)范围内第一个值大于val的元素的位置,如果是数组,返回该位置的指针;如果是容器,返回该位置的迭代器。
如果数组或容器里没有需要寻找的元素,则返回可以插入该元素的位置的指针或迭代器(即假设存在该元素,该元素应当在的位置)。
int a[10] = {1,2,2,3,3,3,5,5,5,5};//注意数组下标从0开始
//寻找-1
int* lowerPos = lower_bound(a,a+10,-1); //0
如果只是想获得欲查元素的下标,就可以不使用临时指针,而直接令返回值减去数组首地址即可。
printf("%d",lower_bound(a,a+10,3)-a);//3