9.6 容器适配器
适配器是标准库的一个通用概念,表示使得一种类型看起来像另一种类型。
一个容器适配器接收一个已有的容器类型。标准库定义的三个容器适配器。
stack,queue,priority_queue.
他们都是在某个顺序容器的基础上实现的。
它们支持的通用操作为。
其中A a©;需要记住以下,c是A的低层实现容器的对象,也就是说可以使用底层容器的对象来初始化容器适配器。
//可以 低层容器是deque
stack<int> s(dq);
//不行,低层容器不是deque
stack<int, vector<int>> s1(dq);
329页,最后一段说明有错误,
stask,queue,priority_queue都没有push_back,push_front的函数。
它们根据自己的特征,把函数名字都给改了。
比如stack,支持
stack<int> s;
s.push(1);//添加元素
s.pop();//删除栈顶元素
s.top();//访问栈顶元素
容器适配器不能够使用低层容器的成员函数。
容器适配器 | 默认低层容器 | 其余可用容器 |
---|---|---|
stack | deque | list、vector |
queue | deque | list,vector |
priority_queue | vector | deque |
priority_queue需要支持随机访问所以不能使用list实现。
stack的操作
queue和priority_queue的操作
注意队列的pop是会删除队列的最前面的元素的,书上写错了
priority_queue,按照优先级存储元素,新加入的元素会排在所有优先级比他低的元素的前面,默认使用<运算符,来作为优先级的依据。
所有优先级对面存入数值的化,会自动排序
std::priority_queue<int> p_queue;
for (const auto item: { 123,12,343,5,3,245,3,6,54,6,45,2,3,12,31 }) {
p_queue.push(item);
}
while (!p_queue.empty()) {
cout << p_queue.top() << endl;
p_queue.pop();
}
练习
9.52
string str = "{123{321}123{123}123}";
stack<char> char_stack;
char_stack.empty();
for (const auto& item:str) {
if(item=='}'){
while (char_stack.top()!='{') {
char_stack.pop();
}
char_stack.pop();
char_stack.push('X');
}
else {
char_stack.push(item);
}
}