STL 栈 stack
头文件: #include<stack>
声明方式: stack<元素类型,存储容器类型>栈名(xxx);
主要操作:
1.xxx.push(元素) 将于素压入栈
2.xxx.top() 取出栈顶元素,(不从栈中删除)
3.xxx.pop() 将栈顶元素删除
4.xxx.size() 返回栈中元素个数
5.xxx.empty() 栈空返回true,否则返回false
#include<iostream>
#include<stack>
using namespace std;
stack<int>myStack;
int main(){
for(int i=0;i<=9;i++){
myStack.push(i);
}
cout<<"Stack Size: "<<myStack.size() <<endl;
cout<<myStack.top()<<endl;//注意,此处栈顶元素并未弹出
cout<<"Stack Size: "<<myStack.size() <<endl;
while(!myStack.empty()){
cout<<myStack.top()<<endl;
myStack.pop();
}
cout<<"Stack Size: "<<myStack.size() <<endl;
}
STL 队列 queue:
头文件: #include<queue>
声明方式: queue<元素类型,存储容器类型>队列名;
主要操作:
1.xxx.front() 返回队首元素
2.xxx.push(元素) 元素入队操作
3.xxx.empty() 队列是否为空
4.xxx.pop() 弹出(清除)队首元素
5.xxx.back() 返回队尾元素
#include<iostream>
#include<queue>
using namespace std;
int main(){
queue<int>myQueue;
for(int i=0;i<=9;i++){
myQueue.push(i);
}
cout<<"Queue Size: "<<myQueue.size()<<endl;
cout<<myQueue.front()<<" "<<myQueue.back()<<endl;
while(!myQueue.empty()){
cout<<myQueue.front()<<endl;
myQueue.pop();
}
cout<<"Queue Size: "<<myQueue.size()<<endl;
return 0;
}
STL 优先队列 priority_queue
头文件: #include<queue>
声明方式: priority_queue<元素类型,存储容器类型,自定义比较方式> pq;
主要操作:
1.pq.top() 返回队首元素(注意此处非front)
2.pq.pop() 删除队首元素
3.pq.empty() 判断队列是否为空
4.pq.push(元素) 将元素压入队列
5.pq.size() 返回当前队列中的元素
优先队列中默认元素由大到小排列,当然也可以自己定义比较函数
#include<iostream>
#include<queue>
using namespace std;
int main(){
priority_queue<int>pq;//默认比较函数,将有大到小输出
for(int i=0;i<=9;i++){
pq.push(i);
}
while(!pq.empty()){
cout<<pq.top()<<" ";
pq.pop();
}
cout<<endl;
}
当我们在做最短路等其他问题是需要用优先队列使最小值先输出这时就用到自定义比较函数,当然也可以用#include<functional>中的greater<元素类型>(由小到大排列,小的先输出),与之相反的 less<元素类型> 由大到小输出
#include<iostream>
#include<functional>
#include<queue>
using namespace std;
int main(){
priority_queue<int,vector<int>,greater<int> >pq;//注意使用greater时,添加容器类型,还有greater<int>" "> 用空格隔开
//priority_queue<int,vector<int>,less<int> >pq;//由大到小输出
for(int i=0;i<=9;i++){
pq.push(i);
}
while(!pq.empty()){
cout<<pq.top()<<" ";
pq.pop();
}
cout<<endl;
}
自己编写自定义比较函数:
//重载"()"运算符 ,元素可以不为结构体类型,当然也可以为结构体类型 ,而"<"是在结构体中重载
struct myComp{
bool operator()(const int &a,const int &b){
//元素由小到大排列,注意是">" ,由大到小排列为"<"
return a>b;
}
};
priority_queue<int,vector<int>,myComp >pq;
当元素为结构体时,可在结构体内重载''<"
方法一:
struct node{
string name;
int Id;
//重载"<" 不能重载">",报错
bool operator<(const node &a)const{//const一个不能少
return a.Id<Id;//按照Id值由小到大排列,注意是a.Id<Id 若为Id<a.Id 则排序规则相反 ,以a.Id为标杆
}
};
方法二:
struct node{
string name;
int Id;
friend bool operator<(const node &a, const node &b){//作为友员比较函数 ,重载"<" ,两个参数,注意排序顺序
//注意此时的比较a.Id<b.Id 使Id由大到小排列
return a.Id<b.Id;
}
};
priority_queue<node>pq;
所以,当元素非结构体时,重载"()"运算符,当元素为结构体时,按方法一在结构体内重载“<”
如有异议,欢迎指正,谢谢