C++STL标准模板库函数之——sort、swap、unique、lower_bound、upper_bound学习小记

前言

  我发现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为关键字进行升序排序。

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的位置。

扫描二维码关注公众号,回复: 143027 查看本文章

  注意这个也是前闭后开的区间。可以形象地理解一下:
这里写图片描述
  代码如下:

#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。

猜你喜欢

转载自blog.csdn.net/qq_36551189/article/details/79994611
今日推荐