前言
我发现C++的STL库中除了sort、swap以外还自带很多实用的函数,而我转C++了这么久竟然不知道,(全都因为我之前是pascal选手)真是弱。
这里将它们做一个总结。
sort
sort这个函数是c++自带的快排函数,所以c++选手可不用手打快排(虽然也很好打)。具体操作如下:
#include <algorithm>//头文件
int a[N];
input();//读入一个长度为n的数组
sort(a+1,a+n+1);//两个参数头指针、尾指针
个中,头指针指的是a[1]那个位置,尾指针指的是a[n]的位置+1。这样,它就会帮你实现[a+1,a+n+1)这个前闭后开的区间内的排序。
sort默认是从小到大升序排序。当然,如果你想以比较复杂的关键字排序,那sort也可以个性化:
bool compare(int x,int y){return x>y;}
sort(a+1,a+n+1,compare);
这样就能实现从大到小降序排序。当然你也可以用a数组存储其他数据类型甚至struct,直接套换即可。
当然,还有一种更为装逼的方法,那就是重载:
struct node
{
int x,y;
}a[N];
bool operator<(const node&a,const node&b){return a.x<b.x;}
sort(a+1,a+n+1);
这样编译器会将程序中(当然也包括sort中)的、所有用于两个node间的<重载为你定义的operator,于是就可以实现以struct中的x为关键字进行升序排序。
如果你还嫌这个麻烦的话,可以在结构体内重载比较函数:
struct node
{
int x,y;
bool operator<(const node b)const{return x<b.x;}
}a[N];
sort(a+1,a+n+1);
我们发现这个重载函数中的参数后面跟着一个“const”,据说这是因为在结构体内定义的函数都会有一个隐藏的指针this指向本结构体,这个const就是修饰它的。
swap
swap函数就是将两个相同数据类型的变量的值互相交换,代码如下:
#include <algorithm>//头文件
int a=1,b=2;
swap(a,b);
a、b最终的值分别为2、1。
当然,你也可以将int换为一个struct,甚至还能换成一个数组。不过换成数组的话,数组大小要相等。
unique
这个函数的对象是一个数组,程序会帮你扫一遍去重,但是它的去重方法是判断两个相邻元素是否相同,所以使用前你还得保证那个数组有序。
那么去完重之后的数组,那些重复的元素都被删掉了吗?No,no,no.它们被unique“藏”到后面去了。
然后它会返回一个值,代表去重之后的尾地址(是地址!!)+1。所以你如果要求去重后的元素个数,得让返回值减个数组的首地址。
譬如,我们进行如下操作:
#include <algorithm>//头文件
int num[10]={1,1,2,2,2,3,4,5,5,5};
int ans=unique(num,num+10)-num;
这时,num={1,2,3,4,5,1,2,2,5,5},ans=5(返回值是num+5,减去一个num变成5)。
lower_bound&&upper_bound
这两个的功能差不多,都是c++中自带的二分函数,作用如下:
ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于值val的位置。
注意这个也是前闭后开的区间。可以形象地理解一下:
代码如下:
#include <algorithm>//头文件
int a[14]={1,2,2,3,4,4,4,4,5,6,7,9,9,10};
int lb=lower_bound(a,a+14,4)-a;
int ub=upper_bound(a,a+14,4)-a;
注意,由于返回值是位置,所以如需求出数组的下标,得先减一个首指针。此时lb=4,ub=8。