Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

c++容器适配器

介绍

c++标准库定义了三个顺序容器适配器:stack、queue和priorty_queue。
适配器是标准库中的一个通用概念。事实上适配器是一种机制,能使某种事物的行为看起来像一种不同的类型。
例如:stack接受一个顺序容器,并使其操作起来像stack一样
以下是所有容器适配器的通用操作和类型

操作/类型 含义
size_type 一种类型,足以保存当前类型的最大对象的大小
value_type 元素类型
container_type 实现适配器的底层容器类型
A a 创建一个名为a的空适配器
A a(c) 创建一个名为a的空适配器,带有容器c的一个拷贝
关系运算符 每个适配器都支持所有关系运算符:==、!=、<=、>=、>和<,这些运算符返回底层容器的运行结果
a.empty() 若a包含任何元素,返回false,否则返回true
a.size() 返回a中包含的元素数目
swap(a,b)/a.swap(b) 交换ab的内容,ab必须有相同的类型,包括底层容器类型也必须相同

定义适配器

每个适配器都定义俩个构造函数:

  1. 默认构造函数创建一个空对象
  2. 接受一个容器的构造函数拷贝该容器来初始化适配器

例如,假定deg是一个deque<int>,我们可以用其来初始化stack如下
stack<int> stk(deg)

默认情况下stack和queue是基于deque实现的,priorty_queue是在vector之上实现的。我们可以在创建一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。

1
2
3
4
//在vector上实现的空栈
stack<string, vector<string>> sttr_stk;
//在vector上实现,初始化时保存svec的拷贝
stack<string, vector<string>> sttr_stk(svec);

对于给定的适配器,可以使用哪些容器是有限制的。所有适配器都要求容器具有添加和删除元素的能力。

使用

栈适配器

stack类型定义在stack头文件中。
stack默认基于deque实现,也可以在list或vector上实现。
以下是stack的常用操作

操作 含义
s.pop() 删除栈顶元素,但不返回该元素值
s.push(item)/s.emplace(arge) 创建一个新元素压入栈顶,该元素通过拷贝或移动item而来,或者由args构造
s.top() 返回栈顶元素,但不将其弹出

队列适配器

queue和priority_queue适配器定义在queue头文件中。
queue默认基于deque实现,也可以用list或vector实现。
priority_queue默认基于vector实现,也可以用deque实现。
priority_queue允许我们为队列中的元素建立优先级。新加入的元素会排在所有优先级比它低的已有元素之前。
以下是常用操作

操作 含义
q.pop() 删除queue的首元素或priority_queue的最高优先级元素,但不返回
q.front()/q.back() 返回首元素或尾元素(只适用于queue)
q.top() 返回最高优先级元素(只适用于priority_queue)
q.push(item)/q.emplace(args) 在queue末尾或priority_queue中恰当位置创建一个元素,其值为item,或者由args构造

评论