9-6 容器适配器


目录
  • 何为适配器
  • 定义一个适配器
    • 默认实现的容器类型
    • 指定实现的容器类型
  • 两种常见适配器
    • 栈适配器
    • 队列适配器

何为适配器

适配器( adaptor)是标准库中的一个通用概念。容器、迭代器和函数都有适配器。

本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。

一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。例如,stack适配器接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样。

所有容器适配器都支持的操作和类型:

image-20220223111440100

定义一个适配器

默认实现的容器类型

默认情况下,stack和queue是基于deque实现的, priority_queue是在vector之上实现的。

所以可以直接用一个deque来初始化stack

stack stk(deq); //从deq拷贝元素到stk

指定实现的容器类型

在创建适配器时可以指定实现该适配器的容器类型

//在vector上实现的空栈
stack > str_stk;
//str_stk2在vector的基础上实现,初始化时保存svec
stack > str_stk2(svec);

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头文件中

image-20220223112527055

int main(){
    stack intStack;       //声明空栈
    for(int ix = 0; ix != 10; ++ix)
        intStack.push(ix);    //将元素入栈
    while(!intStack.empty()){
        cout<

每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作。例如,
intStack.push(ix) ; //intStack保存0到9十个数
此语句试图在intStack 的底层 deque对象上调用push_back。虽然stack是基于deque实现的,但我们不能直接使用deque操作。不能在一个stack上调用push_back,而必须使用stack自己的操作———push。

队列适配器

queue和priority_queue定义在queue头文件中

image-20220223113107050

image-20220223113116798

int main(){
    
    queue intStack;       //声明空栈
    for(int ix = 0; ix != 10; ++ix)
        intStack.push(ix);    //将元素入栈
    while(!intStack.empty()){
        cout<

相关