9.6 容器适配器

  1. 适配器是标准库的一个通用概念,容器、迭代器和函数等都有适配器。适配器是一种机制,接受一种已有容器类型。
  2. 标准库有三个顺序容器适配器:stack,queue和priority_queue。

所有容器适配器支持的操作:

size_type      //一种类型,足以保存当前类型最大对象的的大小
value_type     //元素的类型
container_type //实现适配器的底层容器类型
A a;           //创建一个名为a的空适配器
A a(c);        //创建一个名为a的适配器,内部含有容器c的拷贝
关系运算符      // ==,!=,<,<=,>,>=
a.empty();     //若a包含元素则返回false,否则则是true 
a.size();      //返回a中元素的数目
swap(a,b);     //交换a,b的内容,前提是a,b必须有相同的类型,包括底层容器类型也必须一致。
a.swap(b);     //交换a,b的内容,前提是a,b必须有相同的类型,包括底层容器类型也必须一致。

定义一个适配器

//可以采用对应容器初始化适配器
deque<int> deq;
stack<int> stk(deq);

/*可以适配器将所用顺序容器作为第二个参数,什么意思呢?具体解释就是stack默认是基于deque实现
的,但是我们这里需要将该stack的使用指向vector,所以就需要使用其重载函数,指向vector的函数。
在例子的下面将给出理解图*/
vector<int> svec;
stack<string,vector<string>> stk_stk(svec);

//eg:stack<value_type,container_type>
	deque<int> dq1= { 1,2,3,4 };
	vector<int> vec1 = { 2,3,4,5 };
	stack<int> stk1(dq1);
	stack<int, deque<int>> stk2(dq1);
	stack<int, vector<int>>stk3(vec1);
	stack<int> stk4; //默认deque

理解图:
在这里插入图片描述

stack

  1. 头文件在同名头文件中。
  2. stack默认基于deque实现,因为只要求push_back、pop_back和back操作,可以使用除array和forward_list之外的容器实现。
  3. 先进后出。

具体的使用:

//stack基于deque实现,也可以在list和vector上实现,当然需要使用其重载函数。
stack<int> stk;
stk.push(ix);     //拷贝ix,从而创建一个新的对象,压入栈顶。
stk.empalce(arg); //构造arg,从而创建一个新的对象,压入栈顶。
stk.pop();        //删除栈顶元素,但是不返回其值
stk.top();        //返回栈顶元素,但是不将其删除
等等

关于push和emplace的差别:链接

队列适配器

  1. queue和priority_queue适配器定义在queue的头文件中

queue

  1. queue默认基于deque实现,要求back、front、push_back、push_front、pop_back、pop_front,可以使用list和deque实现,不能用vector(vector和string不支持push_front)。
  2. 先进先出。
//queue基于deque实现,也可以用于vector和list,当然需要用到重载
q.front()//返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
q.back()//返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
q.push(ix)//在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
q.pop()//删除 queue 中的第一个元素,注意是第一个。
q.size()//返回 queue 中元素的个数。
q.empty()//如果 queue 中没有元素的话,返回 true。
q.emplace()//用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。

使用样例:链接

priority_queue 优先队列

  1. priority_queue默认基于vector实现,除front、pop_back、push_back外还需要随机访问的能力,可以用vector、deque实现,不能用list。
//priority_queue基于vector实现,也可以用于deque
q.pop()//删除优先级最高的元素
q.top()//返回最高优先级元素
q.push(ix)
q.emplace(args)

priority_ queue 允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。饭店按照客人预定时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。默认情况下,标准库在元素类型上使用<运算符来确定相对优先级。

使用样例:链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值