STL学习笔记-容器适配器

容器适配器

  1. 容器适配器将原容器进行进一步封装,底层基于普通容器,上层对外提供封装后的新接口,满足不同的适用需求。常用的有栈 stack、队列 queue、优先级队列 priority_queue。
  2. 容器适配器对使用者来说是个黑盒,使用者不需要关注底层实现是什么,只需要了解容器适配器提供的接口。
  3. array不能作为容器适配器的底层容器,因为不支持变长的添加元素
  4. 栈和队列默认适配器是 deque
  5. 优先队列的默认适配器是 vector
  6. 除了使用默认适配器外,也可以手动的指定底层适配器
stack<int> s;  //默认使用deque,但是vector list deque都可用于实现
stack<int, vector<int> > s; //指定使用vector
  1. 优先队列:在元素上添加了权重的概念,添加元素时按照元素优先级插入到相应的位置,删除元素时将优先级最高的元素删除。要求底层容器能够支持随机访问,所以STL中默认使用vector作为底层容器
  2. 栈适配器支持操作:删除栈顶元素-pop,向栈顶压入元素-push,返回栈顶元素-top
  3. 队列适配器支持操作:队列适配器支持删除队首元素-pop,向队尾添加元素-push,返回队首元素-front,返回队尾元素-back;
  4. 优先队列适配器支持删除最高优先级元素-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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值