C++ 标准模板库 STL 容器适配器

C++ 标准模板库 STL 容器适配器

容器数据结构时间复杂度顺序性重复性
stackdeque / list顶部插入、顶部删除 O(1)无序可重复
queuedeque / list尾部插入、头部删除 O(1)无序可重复
priority_queuevector + max-heap插入、删除 O(log2n)有序可重复

​ 容器适配器和容器的主要差别在于,容器适配器没有迭代器,所以STL中的算法无法直接在容器适配器中使用。

栈 stack

stack 类模板定义中有2个模板参数如下:

template <typename T, typename Container = deque<T> >
class stack { …… };

​ 两个参数分别表示栈中元素类型和实现栈的数据结构Container,栈可用 vector, list, deque 来实现,缺省情况下用deque实现;一般情况下推荐使用deque实现,因为用 vector 实现存在是容量大小有限制和扩容耗时的缺陷;而使用list实现则会导致整体性能较差。

​ stack 是后进先出的数据结构,只能插入,删除,访问栈顶的元素。所以,stack上主要可以进行如下操作:

  • push:插入元素
  • pop:弹出元素
  • top:返回栈顶元素的引用
  • empty:判断容器适配器是否为空
  • size:回适配器中元素个数

队列 queue

queuestack 基本相似,其类模板定义中也有相同的2个模板参数如下:

template <typename T, typename Container = deque<T> >
class queue { …… };

​ 两个参数分别表示栈中元素类型和实现栈的数据结构Container,栈可用 vector, list, deque 来实现,缺省情况下用deque实现;一般情况下推荐使用deque实现,因为用 vector 实现存在是容量大小有限制和扩容耗时的缺陷;而使用list实现则会导致整体性能较差。

​ queue 是先进先出的数据结构,可以在队头和队尾操作元素。所以,queue 上主要可以进行如下操作:

  • push:从队尾插入元素
  • pop:弹出队头元素
  • front:返回队头元素的引用
  • back:返回队尾元素的引用
  • empty:判断容器适配器是否为空
  • size:回适配器中元素个数

优先队列 priority_queue

priority_queue 类模板定义中有3个模板参数如下:

template <typename T, typename Container = vector<T>, typename Compare = less<T> >
class priority_queue { …… };

​ priority_queue 通常使用 vector 实现,其内部元素处理规则通常用堆排序(heap)技术实现,保证最大的元素总是在最前面。即执行pop操作时,删除的是最大的元素;执行top操作时,返回的是最大元素的常引用。默认的元素比较器是使用<运算符进行比较的 less<T>

​ 和 queue 相似 priority_queue 可以进行如下操作:

  • push:从队尾插入元素
  • pop:弹出队头元素
  • top:返回队头元素的引用
  • empty:判断容器适配器是否为空
  • size:回适配器中元素个数

​ 一个 priority_queue 使用示例如下:

#include <queue>
#include <iostream>
using namespace std;
int main()
{
    priority_queue<double> pq1;
    pq1.push(3.2); pq1.push(9.8); pq1.push(9.8); pq1.push(5.4);
    while( !pq1.empty() ) {
    	cout << pq1.top() << " ";
    	pq1.pop();
    } 
    cout << endl;
    
    priority_queue<double,vector<double>,greater<double> > pq2;
    pq2.push(3.2); pq2.push(9.8); pq2.push(9.8); pq2.push(5.4);
    while( !pq2.empty() ) {
        cout << pq2.top() << " ";
        pq2.pop();
    }
    return 0;
}

参考资料

程序设计与算法(三)C++面向对象程序设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王清欢Randy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值