C++STL标准库学习笔记(十二)容器适配器

目录

前言:

正文:

1. stack

2. queue

3. priority_queue

4. 容器适配器的元素个数

后记:


前言:

        在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。

        在这一篇文章中,我们主要对STL中的容器适配器进行简单的介绍。

正文:

1. stack

        stack是后进先出的数据结构,只能插入,删除,访问栈顶的元素。

        可以用vector,list,deque来实现,在缺省情况下(缺省即默认),用deque实现(也就是说stack在你不特别定义它是其他的容器来实现时,默认是用deque来实现的,下面讲到的其他容器适配器也是这样)。用vector和deuqe实现,比用list实现性能好。

        template<class T, class Cont = deque<T>>

        class stack

        {

        .......

        };

        stack上可以进行以下操作:

        push 插入元素

        pop 弹出元素

        top 返回栈顶元素的引用

2. queue

        和stack基本类似,可以用list和deque实现。缺省情况下用deque实现。

        template<class T, class Cont = deque<T>>

        class queue

        {

        .......

        };

        同样也有push,pop,top函数。(这些东西数据结构都有讲)

        但是push发生在队尾;top发生在队头。先进先出。

        有back成员函数可以返回队尾元素的引用

3. priority_queue

        template<class T, class Cont = deque<T>,class Compare = less<T>>

        class priority_queue

        {

        .......

        };

        和queue类似,可以用vector和deque实现。缺省情况下用vector实现。

        priority_queue通常用堆排序技术实现,保证最大的元素总是在最前面。即执行pop操作时,删除的是最大的元素;执行top操作时,返回的是最大元素的引用。(这个引用是const的,不能修改)默认的元素比较器是less<T>(就是默认从小到大排序嘛,用“<”来排序)(这不就是队列版的multiset嘛)

        push,pop的时间复杂度O(logn)

        top()时间复杂度O(1)

        样例:

#include<queue>
#include<iostream>
using namespace std;
int main(int argc, char const *argv[])
{
    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();
    }//输出:9.8 9.8 5.4 3.2
    cout<<endl;
    priority_queue<double,vector<double>,greater<double>> pq2;
    //虽然默认是用vector来实现的,这里再用vector也没问题,
    //这里是由于要用后面的比较的方法,就要把它给出来
    pq2.push(3.2);
    pq2.push(9.8);
    pq2.push(9.8);
    pq2.push(5.4);
    while (!pq2.empty())
    {
        cout<<pq2.top()<<" ";
        pq2.pop();
    }//输出:3.2 5.4 9.8 9.8
    
    return 0;
}

4. 容器适配器的元素个数

        stack,queue,priority_queue都有

        empty()成员函数用于判断适配器是否为空

        size()成员函数返回适配器中元素个数

后记:

        学之前不理解“容器适配器”是个啥玩意,学完之后突然理解,容器适配器这五个字拆开,“容器的适配器”,容器有我们之前最知道的deque,vector,list那些,而stack,queue,priority_queue这些容器适配器都通过这几个容器实现,也可以称作这几个适配于容器,哎呀,感觉越讲越乱了,反正就是适配器可以用容器来实现就对了。8说了,下篇笔记见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值