STL中那些好用的东西!(持续更新)
一、数据结构部分
1、set&map(后续持续更新)
2、queue(priority_queue)
queue<int> a; //定义
a.push(i); //压入
a.pop(); //弹出
a.size(); //取大小
a.front(); //访问队首元素
a.back(); //访问队尾元素
**************************************************/
/*****************priority_queue*******************
priority_queue<int,vector<int>,greater<int> > c; //定义从小到大的int类型的优先队列
priority_queue<int> c; //定义从大到小的int类型的优先队列
c.push(); //压入
c.pop(); //弹出队首元素
c.top(); //访问队首元素
//如是结构体必须重载'<'
**************************************************/
/**********************deque***********************
deque<int> b; //定义双端队列
b.push_front(2); //在队首压入元素
b.push_back(3); //在队尾压入元素
b.pop_front(); //弹出队首元素
b.pop_back(); //弹出队尾元素
b.size(); //取大小
b.back(); //访问队尾元素
b.front(); //访问队首元素
//可用[]访问
3、stack
/**********************stack***********************
stack<int> d; //定义
d.push(1); //压入元素
d.pop(); //弹出栈顶元素
d.top(); //访问栈顶元素
d.size(); //取大小
二、#include< algorithm >
很多很扯但是非常实用的函数这里面都包含了,这里就只是列举几个。
1、sort(快速排序,cmp用法详解)
这里我写这篇博客的其中一个目的就是了结了cmp中“<”和“>”符号混用的这一个问题,同时也了解bool operator(符号重定义)的用法。
(1)cmp
咱们先上一道例题来看一下:
题目链接:
YBT1178 成绩排序
我们在使用cmp函数时,要注意以下规则:
1、假设放在cmp函数前面的就是当前放在队列前面的。
2、你要使cmp函数表示的意思是,我的队如果这样排那么就return true;否则 return false;
这样子想是不是感觉简单太多了。
那么下面我们就来一个源代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct student
{
char name[22];
int lenn,scr;
}a[105];
bool cmp(student a1,student b1)
{//一定要记住a1在队中一定是排在b1前面的,下面我们就要用cmp对这样的排序进行检查,看一下这样排是否合法
if(a1.scr>b1.scr) return true;
//此时a1.scr>b1.scr(在本题中成绩要求从大到小排)所以合法,输出正确!
if(a1.scr==b1.scr&&strcmp(a1.name,b1.name)<0) return true;
//此时a1.scr==b1.scr(在本题中如果成绩相等,那么就按字典序对名字进行排名),如果此时a名字的字典序小于b那么这样排合法,输出正确!
return false;
//除此之外,其他的都不合法,输出错误!!!
}
int n;
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%s%d",a[i].name,&a[i].scr);
a[i].lenn=strlen(a[i].name);
}
sort(a,a+n,cmp);//注意sort里面的cmp函数不需要加入()!!!
for(int i=0;i<n;++i)
{
for(int j=0;j<a[i].lenn;++j)
{
printf("%c",a[i].name[j]);
}
printf(" %d\n",a[i].scr);
}
return 0;
}
(2)bool operator
这个操作叫做重定义符号(一般排序的时候是重新定义小于符号,更多关于此玩意儿的实际用法可以见我的博客的有几篇文章中有所提及)
这里良心给几个链接:
拓展:结构体中的函数:
2、random_shuffle(随机洗牌)
随机洗牌函数,用法同初级sort函数,非常好用!
3、swap(交换)
交换函数,相信大家都会觉得交换这东西应该比较好实现,但是一个长代码中一直写自己写的交换,应该也会被写煩,所以这个东西某种意义上来说还是有他的存在价值的。
4、unique(相邻去重)
这也是一个很神奇的函数,他是可以把一个数列中挨在一起相同的数提取出来,然后把他扔到数列的末尾,从而实现去重功能。可以搭配sort实现很好的去重排序。那有些朋友就可能会问,那我怎么知道最后我输出来的东西是什么,我如何判断这个队列后面那些是被扔出来的重复部分。这个问题不用担心,因为unique去重完后自己返回一个去重完毕后的队列的尾指针!
下面是一个实现了用unique进行去重排序的程序:
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=unique(a,a+n)-a;//一定要从0开始
for(int i=0;i<ans;++i)
{
printf("%d ",a[i]);
}
return 0;
}
/*
6
2 4 3 4 2 6
*/
5、像那些全排列函数等不常用的就先略过啦~~~~~
6、lower_bound&upper_bound
lower_bound就是求出一个有序区间找出ai>=k,的最小指针;(因为他用的是二分搜索,所以肯定比自己for一遍找要快很多),upper_bound就是求出ai>k的最小指针,琢磨一下还是会发现很有用的!
后续持续更新!
(因为写这篇博客unique函数部分时,我被那个指针搅得死去活来,所以后续我还有可能会发出一些关于指针的博客,欢迎关注!!!)