STL 队列、优先队列、栈
queue和priority_queue的头文件都是#include stack的头文件是#include
queueq eg:queueq 本身先进先出
q.push(x)压队尾,q.pop()队首元素出栈 q.empty()判断队列是否为空 q.size()返回里面元素的个数
q.front()访问队首元素 q.back()访问队尾
priority_queuepq eg:priority_queuepq,优先队列按照里面的元素默认按照最大值在队首。(int之类的是数字大在前面,char是字典序)
优先队列也有pop,push,empty,size功能相同
默认的缺省定义和priority_queue,less >是一样的,如果less换成greater这个变成最小值在前面(这三个的typename要统一)
有时候顺序需要自定义,或者是结构体之类的不容易比较的,这时候在struct里面使用友元函数重载小于号或者新建structcmp直接重载(),这两个return的和实际序列相反的哦(跟sort的cmp比较的)
比如return a
#include
#include
using namespace std;
struct fruit
{
string name;
int price;
friend bool operator <(fruit f1,fruit f2)
{
return f1.price<f2.price;
}
}f1,f2,f3;
int main()
{
priority_queue q;
f1.name="桃子";
f1.price=3;
f2.name="梨子";
f2.price=4;
f3.name="苹果";
f3.price=1;
q.push(f1);
q.push(f2);
q.push(f3);
cout<endl;
return 0;
}
友元
#include
#include
using namespace std;
struct fruit
{
string name;
int price;
}f1,f2,f3;
struct cmp
{
bool operator () (fruit f1,fruit f2)
{
return f1.price<f2.price;
}
};
int main()
{
priority_queue,cmp>q;
f1.name="桃子";
f1.price=3;
f2.name="梨子";
f2.price=4;
f3.name="苹果";
f3.price=1;
q.push(f1);
q.push(f2);
q.push(f3);
cout<endl;
return 0;
}
cmp重载
如果遇到较大范围的需要比较的,在fruit a的位置变成const fruit &a,其余不变,cmp和小于号都适用
在使用front或者top的时候需要确保队列不为空,不然可能出现奇怪的结果。
栈是后进先出的
stacks
访问只能s.top()访问栈顶,还有s.pop(),s.push(x),s.empty(),s=.size()