你还在为手写优先队列而头疼吗?你还在为hash写不出而烦恼吗?你已经想我一样成为板子都不想背的夕阳红选手了吗?非常好,现在,隆重向你推荐一批超级好用的STL函数。
队列-queue
#include<queue>//queue头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
queue<int>q;//定义一个每个点都是int的队列q
int main()
{
q.push(3);//在队尾插入一个3
q.push(2);//在队尾插入一个2
printf("%d\n",q.front());//输出队头
printf("%d\n",q.back());//输出队尾
if(q.empty())printf("Yes\n");
else printf("No\n");
// q.empty() 判断q是否为空,空则返回True,不空则返回False
q.pop();//将队头退队
printf("%d\n",q.size());//输出队列中元素个数
return 0;
}
优先队列-priority_queue
#include<queue>//queue头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
struct node
{
int x,y;
bool operator < (const node &v) const
{
if(x>v.x)return(true);
else return(false);
}//重载<号的定义
};//定义node类型
priority_queue<node>q;//定义一个每个点都是node的优先队列q
node o;
int main()
{
o.x=1;o.y=1;
q.push(o);//在队列中插入o
o.x=2;o.y=2;
q.push(o);//在队列中插入o
if(q.empty())printf("Yes\n");
else printf("No\n");
// q.empty() 判断q是否为空,空则返回True,不空则返回False
o=q.top();//输出优先队列的队头【此时以x为关键字从小到大排序】
printf("%d %d\n",o.x,o.y);//输出队头元素【也就是x值最小的元素】
printf("%d\n",q.size());//输出队列中元素个数
return 0;
}
双向队列-deque
#include<queue>//queue头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
deque<int>q;//定义一个每个点都是int的双向队列q
int main()
{
q.push_back(3);//在队尾插入一个3
q.push_front(2);//在队首插入一个2
printf("%d\n",q.front());//输出队头
printf("%d\n",q.back());//输出队尾
if(q.empty())printf("Yes\n");
else printf("No\n");
// q.empty() 判断q是否为空,空则返回True,不空则返回False
q.pop_front();//将队头退队
printf("%d\n",q.size());//输出队列中元素个数
return 0;
}
栈-stack
#include<stack>//stack头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
stack<int>s;//定义一个每个节点都为int的栈s
int main()
{
s.push(1);//在栈顶插入一个1
s.push(2);//在栈顶插入一个2
if(s.empty())printf("Yes\n");
else printf("No\n");
// s.empty() 判断s是否为空,空则返回True,不空则返回False
printf("%d\n",s.top());//输出栈顶元素
s.pop();//将栈顶元素弹出
printf("%d\n",s.top());//输出栈顶元素
printf("%d\n",s.size());//输出栈中元素个数
return 0;
}
大小可变数组-vector
#include<cstdio>
#include<vector>//vector头文件
#include<cstdlib>
using namespace std;
vector<int>v;//定义一个每个元素都是int的可变长数组v
int main()
{
vector<int>::iterator beg,en; //定义vector迭代器
v.push_back(1);//在v的末尾插入一个1
v.push_back(2);//在v的末尾插入一个2
v.push_back(3);//在v的末尾插入一个3
printf("%d\n",v[0]);//访问v中下标为0的值
printf("%d\n",v[1]);//访问v中下标为1的值
printf("%d\n",v[2]);//访问v中下标为2的值
v.pop_back();//将v的末尾弹出
printf("%d\n",v.front());//输出v的开头
v[1]=233;//修改v中下标为1的值
for(vector<int>::iterator i=v.begin();i<v.end();i++)printf("%d\n",*i);
//输出vector中的元素
v.erase(v.begin());//将在 v.begin() 位置的值删去
beg=v.begin();en=v.end();
v.erase(beg,en);//将[v.begin(),v.end())之间的值全部删去
v.insert(beg,1);//在 v.begin() 位置假如一个1
v.clear();//清除整个v
return 0;
}
普通集合-set
#include<set>//set头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
set<int>s;//定义集合s【集合中无重复元素】
set<int>ss;//定义集合ss
int main()
{
s.insert(1);//在s中插入一个1
s.insert(2);//在s中插入一个2
s.insert(3);//在s中插入一个3
ss.insert(s.begin(),s.end());//将s合并到ss上
printf("%d\n",ss.size());//输出ss的大小
if(ss.empty())printf("Yes\n");
else printf("No\n");
// ss.empty() 判断ss是否为空,空则返回True,不空则返回False
set<int>::iterator it;//定义set迭代器
it=ss.begin();
printf("%d\n",*it);//查询最小值
it=ss.end();it--;
printf("%d\n",*it);//查询最大值
ss.erase(2);//将集合中的2删除
printf("%d\n",*ss.lower_bound(1));//输出集合中大于等于1的最小的数
printf("%d\n",*ss.upper_bound(2));//输出集合中大于2的最小的数
return 0;
}
可重复集合-multiset
#include<set>//set头文件
#include<cstdio>
#include<cstdlib>
using namespace std;
multiset<int>s;//定义集合s【集合中可存在重复元素】
multiset<int>ss;//定义集合ss
int main()
{
s.insert(2);//在s中插入一个2
s.insert(2);//在s中插入第二个2
s.insert(3);//在s中插入一个3
ss.insert(s.begin(),s.end());//将s合并到ss上
printf("%d\n",ss.size());//输出ss的大小
if(ss.empty())printf("Yes\n");
else printf("No\n");
// ss.empty() 判断ss是否为空,空则返回True,不空则返回False
set<int>::iterator it;//定义set迭代器
it=ss.begin();
printf("%d\n",*it);//查询最小值
it=ss.end();it--;
printf("%d\n",*it);//查询最大值
ss.erase(2);//将集合中的所有2删除
printf("%d\n",ss.size());//输出ss的大小
printf("%d\n",*ss.lower_bound(1));//输出集合中大于等于1的最小的数
printf("%d\n",*ss.upper_bound(2));//输出集合中大于2的最小的数
return 0;
}
散列表-map
#include<map>//map头文件
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<iostream> //这个不能少
#include<algorithm>
using namespace std;
map<string,int> m;//定义一个以字符串为下标,值为整型的散列表
int main()
{
pair<string,int>mp;
m["abb"]=1;//将“abb”赋值为1
m["baa"]=2;//将“baa”赋值为2
if(m.find("abb")==m.end())printf("No\n");
else printf("Yes\n");
//若存在“abb”,则返回 “abb”位置的迭代器
//若不存在“abb”,则返回 m.end()
mp=*m.find("abb");
printf("%d\n",mp.second);//输出“abb”的对应值
m["abb"]=1;//将“abb”赋值为1
m["baa"]=2;//将“baa”赋值为2
if(m.find("abbb")==m.end())printf("No\n");
//若存在“abbb”,则返回 含有“abb”的迭代器
//若不存在“abbb”,则返回 m.end()
else printf("Yes\n");
}
结语
转眼间,蒟蒻就高三退役啦,再更新完最后几篇BLOG后,我就要去学文化课啦,期待着我们下一次的相遇。最后希望你喜欢这篇BLOG!
友情提示:
不要过于依赖stl,OI在没有氧气(O2)的情况下虽然stl卡常几率微乎其微,但还是有的
(你可以向某学长学习5分钟平衡树热身)
比如yjh?(滑稽OωO)
Orz
大佬太巨了Orz