容器适配器
- 容器适配器将原容器进行进一步封装,底层基于普通容器,上层对外提供封装后的新接口,满足不同的适用需求。常用的有栈 stack、队列 queue、优先级队列 priority_queue。
- 容器适配器对使用者来说是个黑盒,使用者不需要关注底层实现是什么,只需要了解容器适配器提供的接口。
- array不能作为容器适配器的底层容器,因为不支持变长的添加元素
- 栈和队列默认适配器是 deque
- 优先队列的默认适配器是 vector
- 除了使用默认适配器外,也可以手动的指定底层适配器
stack<int> s; //默认使用deque,但是vector list deque都可用于实现
stack<int, vector<int> > s; //指定使用vector
- 优先队列:在元素上添加了权重的概念,添加元素时按照元素优先级插入到相应的位置,删除元素时将优先级最高的元素删除。要求底层容器能够支持随机访问,所以STL中默认使用vector作为底层容器
- 栈适配器支持操作:删除栈顶元素-pop,向栈顶压入元素-push,返回栈顶元素-top
- 队列适配器支持操作:队列适配器支持删除队首元素-pop,向队尾添加元素-push,返回队首元素-front,返回队尾元素-back;
- 优先队列适配器支持删除最高优先级元素-pop,添加元素-push,返回最高优先级元素top。
面试题目:使用队列保存一组矩形对象,矩形长宽为1-100的随机数,要求优先队列的元素为矩形面积,并按照面积大小依次输出长和宽
//定义一个 square类
class Square{
public:
int length;
int width;
Square(int l,int w):length(l),width(w){}
}
//定义一个包含Square对象的优先队列
priority_queue<Square,vector<Square>>; //这里存在一个问题,自定义类型没有默认的比较函数
//定义一个函数对象实现权重比较
class Compare{
public:
bool operator()(Square x,Square y){
return ((x.length * x.width) < (y.length* y.width))
}
}
//然后可以通过一下代码创建优先级队列
priority_queue<Square,vector<Square>,Compare> p;
此时就可以使用push函数向优先队列中插入元素,通过top访问最高元素,通过pop删除优先队列中优先级最高的元素。
真题:
/* 对一个栈进行排序,要求栈顶放最大的元素,到栈底依次减小
限制条件:只能使用一个栈作为数据结构
思路:取出原始栈顶元素,与临时栈顶元素比较,如果大于栈顶元素,直接压栈。如果小于栈顶元素,说明临时栈需要调整一下,因为没有其他存放临时变量的地方,可以直接把所有大于该元素的临时栈元素压入原始栈,然后再把当前元素压到临时栈。
*/
stack<int> sort(stack<int> s) {
stack<int> stemp;
while (!s.empty())
{
int topOfS = s.top();
s.pop();
while (!stemp.empty()&&stemp.top()>topOfS)
{
s.push(stemp.top());
stemp.pop();
}
stemp.push(topOfS);
}
return stemp;
}