标准库定义了三个顺序容器适配器:stack、queue和priority_queue
容器、迭代器和函数都有适配器,接受一种已有的容器类型,使其行为看起来像一种不同的类型
例如,stack适配器接受一个顺序容器(除array和foward_list),并使其像一个stack
容器适配器支持的操作和类型
size_type 一种类型,保存当前类型的最大对象的大小
value_type 元素类型
container_type 实现适配器的底层容器类型
A a; 创建一个名为a的空适配器
A a(c);
关系运算符 适配器都支持所有关系运算符:==、!=、<、<=、>、>=这些运算符返回底层容器的比较结果
a.empty()
a.size() 返回a中的元素数目
swap(a,b) 交换a和b的内容,a和b必须有相同类型,包括底层容器类型也必须相同
a.swap(b)
定义一个适配器
定义两个构造函数:
1)默认构造函数创建一个空对象
2)接受一个容器的构造函数拷贝该容器来初始化适配器
satck<int>stk(deq);//从deq(deque<int>)拷贝元素到stk
默认情况,stack和queue基于deque实现,priority_queue是在vector之上实现
stack<string,vector<string>>str_stk;//在vector上实现的空栈
stack<string,vector<int>>str_stk2(svec);//初始时保存svec的拷贝
对于一个给定的适配器,可以使用哪些容器是有限的。
所有适配器要求容器具有添加和删除元素的能力。所以,适配器是不能构造在array,forward_list_上。
stack只要求push_back、pop_back和back操作,可使用除上述两种容器的其他容器构造
queue要求back、push_back、front和push_front,构造于list和deque,但不能为vector
priority_queue要求front、push_back和pop_back操作,还要求随机访问能力,构造于vector或deque,不能基于list构造
栈适配器
s.pop() 删除栈顶元素,但不返回该元素值
s.push(item) 创建一个新元素压入栈顶,该元素通过拷贝或移动item,或者
s.emplace(args) 由args构造
s.top() 返回栈顶元素,但不出栈
我们只能使用是适配器自己的操作,不能使用底层容器的操作
队列适配器
queue和priority_queue适配器定义在queue头文件中
queue默认基于deque实现,priority_queue默认基于vector实现
queue也可以用list和vector实现,priority_queue也可以使用deque实现
q.pop() 返回queue的首元素或priority_queue的最高级优先级的元素,但不删除此元素
q.front() 返回首元素或尾元素,但不删除此元素
q.back() 只适用queue
q.top() 返回最高优先级的元素,但不删除此元素,只适用于priority_queue
q.push(item) 在queue和priority_queue中恰当的位置创建一个元素
q.emplace(args) 其值为item,或者由args构造
标准库queue先进先出的存储和访问策略,priority_queue允许我们为队列的元素建立优先级