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

前言:

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

  在这一篇文章中,我们主要对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)

  样例:

 1 #include<queue>
 2 #include<iostream>
 3 using namespace std;
 4 int main(int argc, char const *argv[])
 5 {
 6     priority_queue<double> pq1;
 7     pq1.push(3.2);
 8     pq1.push(9.8);
 9     pq1.push(9.8);
10     pq1.push(5.4);
11     while (!pq1.empty())
12     {
13         cout<<pq1.top()<<" ";
14         pq1.pop();
15     }//输出:9.8 9.8 5.4 3.2
16     cout<<endl;
17     priority_queue<double,vector<double>,greater<double>> pq2;
18     //虽然默认是用vector来实现的,这里再用vector也没问题,
19     //这里是由于要用后面的比较的方法,就要把它给出来
20     pq2.push(3.2);
21     pq2.push(9.8);
22     pq2.push(9.8);
23     pq2.push(5.4);
24     while (!pq2.empty())
25     {
26         cout<<pq2.top()<<" ";
27         pq2.pop();
28     }//输出:3.2 5.4 9.8 9.8
29     
30     return 0;
31 }

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

  stack,queue,priority_queue都有

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

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

 

后记:

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

上一篇:Mybatis源码之Statement处理器SimpleStatementHandler(四)


下一篇:394. 字符串解码