###适配器意思是可以将一种不能用于某种场景的东西经过特殊转换,包装成一个新东西,这个新定西可以用于这个场景,并且还具有之前旧东西的功能作用;
stack、queue就是C++里面的容器适配器,这两个适配器堆vector和list两个容器进行了包装,具有vector和list的特性;
deque相当于一个缝合怪,具有list和vector的特性,所以在标准库中,stack和queue都是将deque作为包装的缺省类型,至于怎么包装的,后续介绍,现在只用记得deque具有vector和list的各有的特性。
一、stack
栈先进后出,它的结构就像羽毛球同,它的数据就是羽毛球筒里面的羽毛球,先放进去的要最后才能取出来,后放进去的先去出来。
栈是一个类模板,模板参数T是它的数据类型,Container是stack包装的容器的具体类型,传过来的是什么就是上面,例如,传过来的是vector<int>,那么Container就是这个容器适配器适配的容器,也就是vector;默认缺省类型给deque<T>,是因为它能兼具vector和list。
头文件是<stack>
可适配list,vector、deque;
1、初始化
这个ctnr代表的是容器;
stack的初始化很简单,只有两种:第一种是不给初始化的具体值,那么就是空的;第二种就是给特定的容器,并且容器里面有数据,那么此时的stack初始化之后就是这个容器里面的数据;
###代码演示:
int main()
{
deque<int> dq(10, 9);
list<int> lt(10, 1);//这里也可以用 vector 演示
stack<int, list<int>> st1(lt);
stack<int> st2;//第二个模板参数就是 deque<int>
return 0;
}
2、其他常用接口
void test01()
{
srand((unsigned int)time(nullptr));
vector<int> vt;
for (int i = 0; i < 10; i++)
{
int data = rand() % 100 + 1;
vt.push_back(data);
}
for (auto& it : vt)
{
cout << it << ' ';
}
cout << endl;
stack<int, vector<int>> st(vt);
while (!st.empty())//判空
{
cout << st.top() << " ";//栈顶,也就是最后插入的数据
st.pop();//删除栈顶,更新栈顶元素
}
cout << endl;
//判空
cout << st.empty() << endl;
//大小
cout << st.size() << endl;
//往栈顶插入元素
for (int i = 1; i <= 10; i++)
{
st.push(i);
}
//打印观察
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
}
二、queue
queue就是队列,先进先出,和人排队一样,先排队的人先出去队列,后面的后出;
其他和stack一样;区别是接口的不同;
还有一点,这个适配器不适配vector,因为这个适配器实现时底层用了pop_front函数,但是vector容器没有这个接口,list和deque有;
list有push_back、push_front、pop_back、pop_front;
vector有push_back、pop_back;
1、初始化
和stack一样的两种初始化,注意不能用vector;
2、其他常用接口
void test02()
{
list<int> vt;
for (int i = 1; i <= 10; i++)
{
vt.push_back(i);
}
queue<int, list<int>> q(vt);
//判空
cout <<"是否为空:"<< q.empty() << endl;
//大小
cout <<"队列大小:"<< q.size() << endl;
//对头和队尾的元素
cout <<"队头数据:"<< q.front() << endl;
cout <<"队尾数据:"<< q.back() << endl;
//队尾进数据
q.push(99);
cout << "队尾数据:" << q.back() << endl;
//队头出数据
q.pop();
cout << "队头数据:" << q.front() << endl;
}
emplace就是在队尾插入数据,swap就是交换两个队列;