概念
适配器(Adaptors)是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。一个容器适配器(Container adaptors)接受一种已有的容器类型,使其行为看起来像一种不同的类型。标准库定义了三个序列容器适配器:stack、queue和priority_queue。
通用操作和类型
定义一个适配器
每个适配器都定义两个构造函数:默认构造函数创建一个空对象,接受一个容器的构造函数拷贝该容器来初始化适配器。std::vector<int> deq;
std::stack<int> stk(deq);//从deq拷贝元素到stk
默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个容器适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
std::stack<string, std::vector<string>> str_stk;//在vector上实现空栈
std::stack<string, std::vector<string>> str_stk2(svec);//str_stk2在vector上实现,初始化时保存svec的拷贝
对于给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。因此,适配器不能构造在array之上。类似的,我们也不能用forward_list来构造适配器,因为所有适配器都要求容器具有添加、删除以及访问尾元素的能力。
具体说来,stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器类型来构造stack。queue适配器要求back、push_back、front和push_front,因此它可以构造在list或deque之上,但不能基于vector构造。priority_queue除了front、push_back和pop_back操作之外还要求随机访问能力,因此它可以构造于vector和deque之上,但不能基于list构造。
栈适配器
stack的特点是先进先出(FIFO,First In First Out),栈适配器默认基于deque实现,也可显式指明在list或vector上实现。除了拥有容器适配器都有的操作以外还可以进行如下操作:
队列适配器
队列适配器有queue和priority_queue两种,它们都定义在名为queue的头文件中。 queue默认基于deque实现,priority_queue默认基于vector实现。queue也可以用list或vector实现,priority_queue也可以用deque实现。queue使用一种先进先出(First-in, First-out, FIFO)的存储和访问策略。进入队列的对象被放置到队尾,而离开队列的对象则从队首删除。
priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。
队列适配器的额外操作有:
本文摘自《C++ Primer(中文版)第五版》