9.6 容器适配器
文章目录
- 定义一个适配器
- stack
- 队列适配器
- queue
- priority_queue 优先队列
- 适配器是标准库的一个通用概念,容器、迭代器和函数等都有适配器。适配器是一种机制,接受一种已有容器类型。
- 标准库有三个顺序容器适配器: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
- 头文件在同名头文件中。
- stack默认基于deque实现,因为只要求push_back、pop_back和back操作,可以使用除array和forward_list之外的容器实现。
- 先进后出。
具体的使用:
//stack基于deque实现,也可以在list和vector上实现,当然需要使用其重载函数。
stack<int> stk;
stk.push(ix); //拷贝ix,从而创建一个新的对象,压入栈顶。
stk.empalce(arg); //构造arg,从而创建一个新的对象,压入栈顶。
stk.pop(); //删除栈顶元素,但是不返回其值
stk.top(); //返回栈顶元素,但是不将其删除
等等
关于push和emplace的差别:链接
队列适配器
- queue和priority_queue适配器定义在queue的头文件中
queue
- queue默认基于deque实现,要求back、front、push_back、push_front、pop_back、pop_front,可以使用list和deque实现,不能用vector(vector和string不支持push_front)。
- 先进先出。
//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 优先队列
- 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 允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。饭店按照客人预定时间而不是到来时间的早晚来为他们安排座位,就是一个优先队列的例子。默认情况下,标准库在元素类型上使用<运算符来确定相对优先级。
使用样例:链接