适配器
在STL中提供了三个常用容器适配器:stack栈,queue队列,priority_queue优先级队列。
适配器都是包装了vector,list,deque中某个顺序容器的包装器,也可以看作由其他容器实现的容器。
适配器没有提供迭代器,也不能同时插入或删除多个元素。
Stack
stack适配器的默认的参数中容器使用deque实现的,可选择的容器有list,vector,deque,实现后进先出的值的排列(栈结构)
主要操作
- push(x) 压入
- pop() 弹出
- top() 获取栈顶元素(不弹出)
- empty()
- size()
代码
#include<iostream>
#include<stack>
using namespace std;
int main() {
stack<int> s;//default::deque默认为deque为底层容器
//入栈
s.push(1);
s.push(7);
s.push(2);
s.push(5);
//出栈
while (!s.empty()) {
//栈顶元素
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
自定义底层容器
stack<int, vector<int>> s;
注意
- 取栈顶元素不会删除栈顶元素;pop()无返回值 ,负责出栈
- stack s;//default::deque默认为deque为底层容器
- 头文件#include<stack>
queue
queue默认底层容器为deque,也可以为list,不能为vector(因为vector不能对头部元素进行操作,而queue是尾部进队,头部出队),先进先出(队列结构)
主要操作
- push(x) 压入
- pop() 弹出
- front() 获取首元素(不弹出)
- back()
- empty()
- size()
代码
#include<iostream>
#include<queue>
using namespace std;
int main() {
queue<int> q;
q.push(1);
q.push(7);
q.push(2);
q.push(3);
q.push(8);
q.push(11);
q.push(100);
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}
}
修改底层数据结构
#include<list>
queue<int, list<int>> q;
priority_queue
priority_queue也是一个队列,其元素按有序顺序排列,但不采用严格的先进先出的顺序,而是按照优先级,给定时刻位于对头的元素正式有最高优先级的元素。如果两个元素具有相同优先级,那么它们在队列中就遵循先进先出的语义,它默认适配的底层容器为vector,也可以使用deque,但不能用list,因为priority_queue要求能对元素随机访问以便进行排序,list底层为链表,不能随机访问。
主要操作
代码
#include<iostream>
#include<queue>
#include<functional>
using namespace std;
int main() {
priority_queue<int, vector<int>, less<int>> pq;//大的元素优先级高
pq.push(101);
pq.push(2);
pq.push(35);
pq.push(28);
pq.push(7);
pq.push(3);
while(!pq.empty()) {
cout << pq.top() << " ";
pq.pop();
}
}
使用deque为底层:
priority_queue<int, deque<int>, greater<int>> pq;
注意
- 头文件#include<queue>,定义priority_queue<数据类型,底层数据结构,排序方法>
- less 表示大的优先级高,大的先出队,从大到小
- greater表示小的优先级高,小的先出队,从小到大