一 简介
容器适配器 是一个比较抽象的概念,C++的解释是:适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器是让一种已存在的容器类型采用另一种不同的抽象类型的工作方式来实现的一种机制。其实仅是发生了接口转换。那么你可以把它理解为容器的容器,它实质还是一个容器,只是他不依赖于具体的标准容器类型,可以理解是容器的模版。或者把它理解为容器的接口,而适配器具体采用哪种容器类型去实现,在定义适配器的时候可以由你决定。
二 分类
1.stack 栈
栈的特征是先进后出,后入栈的元素先出栈,先入栈的元素后出栈,因此站适配器应该支持从栈顶添加删除元素以及访问元素的操作。容器vector、list和quque都满足栈操作的条件,因此都能作为栈适配器的底层容器,STL中默认使用deque作为栈适配器的底层容器。
例子
/*
stack<int> s;
stack< int, vector<int> > stk; //覆盖基础容器类型,使用vector实现stk
s.empty(); //判断stack是否为空,为空返回true,否则返回false
s.size(); //返回stack中元素的个数
s.pop(); //删除栈顶元素,但不返回其值
s.top(); //返回栈顶元素的值,但不删除此元素
s.push(item); //在栈顶压入新元素item
*/
int main()
{
stack<int> stack;
cout << "栈为空输出0,否则输出1:" << (stack.empty() ? 0 : 1) << endl;
stack.push(1);
stack.push(2);
stack.push(3);
cout << "栈的大小:" << stack.size() << endl;
cout << "栈顶是:" << stack.top() << endl;
stack.pop();
cout << "删除一个元素,栈顶是:" << stack.top() << endl;
return 0;
}
结果
2 queue 队列
队列的特征是先进先出,先入队的元素先出队,后入队的元素后出队,因此队列适配器应该支持从队头删除元素、向队尾添加元素以及访问队头队尾元素的操作。由于容器vector在删除首元素时需要移动所有元素,因此不适合作为队列适配器的底层容器,应该选用list或者deque,STL中默认使用deque作为队列适配器的底层容器。
例子
/*
queue<int> q;
q.empty(); //判断队列是否为空
q.size(); //返回队列长度
q.pop();//删除队列首部的元素
q.push(item); //对于queue,在队尾压入一个新元素
q.front(); //返回队首元素的值,但不删除该元素
q.back(); //返回队尾元素的值,但不删除该元素
*/
#include <queue>
int main()
{
queue<int> queue;
cout << "队列为空输出0,否则输出1" << (queue.empty() ? 1 : 0) << endl;
queue.push(1);
queue.push(2);
queue.push(3);
cout << "队列的大小是:" << queue.size() << endl;
cout << "队首是:" << queue.front() << endl;
cout << "队尾是:" << queue.back() << endl;
queue.pop();
cout << "删除一个元素后,队列的大小是:" << queue.size() << endl;
cout << "删除一个元素后,队首是:" << queue.front() << endl;
cout << "删除一个元素后,队尾是:" << queue.back() << endl;
return 0;
}
结果
3 priority_queue 优先队列
优先队列在逻辑上与队列相似,一端插入元素和另一端删除元素,但是优先队列在元素中加入了权重的概念。优先队列中的元素并非像队列一样按照插入的顺序依次排列,而是根据元素的权重排列。添加元素时按照元素优先级插入到相应的位置,删除元素时将优先级最高的元素删除。
优先队列的插入删除元素在底层容器实现的堆上进行操作。在堆的插入删除算法中,需要随机访问元素,因此不能使用list作为优先队列适配器的底层容器,比较而言deque也不太适合,STL中默认使用vector作为优先队列适配器的底层容器。
例子
#include<queue>
/*
priority_queue<int> q;
q.empty(); //判断队列是否为空
q.size(); //返回队列长度
q.pop();//删除队首元素
q.push(item); //对于priority_queue,在基于优先级的适当位置插入新元素
q.top(); //返回具有最高优先级的元素值,但不删除该元素
*/
int main()
{
priority_queue<int> pri;
cout << "优先队列为空输出0,否则输出1:" << (pri.empty() ? 0 : 1) << endl;
pri.push(3);
pri.push(5);
pri.push(1);
while (!pri.empty())
{
cout << "优先队列队首是:" << pri.top() << endl;
pri.pop();
}
return 0;
}
结果
三 指定容器方法
stack<int, list<int>>stack;//指定list实现栈
queue<int, list<int>>queue;//指定list实现队列
priority_queue<int, list<int>> prilist;//指定list实现优先队列