《STL源码剖析》学习笔记之四——序列式容器


 

STL中序列式容器包含如下:array,vector,list,deque,priority-queue,slist,stack,queue。其中array属于C++语言的内建的数据结构,另外stack和queue属于适配器,两者均采用deque作为底层的数据容器。

  

(一)  vector

1、特点:动态空间,随着元素的加入,内部机制会自行扩充空间以容纳新元素。“配置新空间,数据移动,释放旧空间”

2、程序示例:

#include<vector>

#include<iostream>

#include<algorithm>

using namespace std;

int main()

{

   vector<int> sv(2,10); //初始化定义 2个元素,初始值为10

   cout<<sv.size()<<endl; // 2 元素个数

   cout<<sv.capacity()<<endl; // 2 总容量

 

   sv.push_back(3); //添加元素到尾部

   cout<<sv[0]<<endl;

   sv.pop_back(); //添加

  vector<int>::iterator ite=find(sv.begin(),sv.end(),10);

  if(ite!=sv.end())

     sv.insert(ite,1,7);

   return 0;

 

 3.内存管理:

增加新数据或插入新数据时,需要检查备用空间是否足够,vector有三个索引参数:start、finish、end_of_storage.

前两个参数指向已用空间的首位,最后一个参数指向备用空间的最后一个地址。若插入数据所需内存大于备用空间,则需要重新配置原地址空间两倍大小的空间,然后把现有数据全部拷贝过去,然后释放旧空间。

 

 

(二)  list

1、  特点:双向链表,只能顺序访问,插入操作不会使原有数据的迭代器失效。

2、  程序示例:

template<classT>

struct_list_node{

typedefvoid* void_pointer;

void_pointerprev;

void_pointernext;

Tdata;

}

3、  内存管理:

设计有专有的节点内存配置、释放、构造、销毁的函数,采用空间配置器中的allocate和deallocate,construct和destory;

 

(三)  deque

1、  特点:双向开口的连续线性空间,头尾两端均可做元素的插入和删除操作。没有容量的概念,动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。采用一小块连续空间(中控器),其中每个元素又为一个指向另一段较大连续空间的首地址指针(缓冲区),缓冲区存放数据。

2、  数据结构:

template<class T,classAlloc=alloc,size_t BufSiz =0>

class deque{

public:

typedef T  value_type;

typedef value_type*  pointer;

typedef size_t  size_type;

protected:

 typedefpointer*  map_pointer;

 iterator start;

iterator finish;

map_pointer map;

 size_type map_size;

}


  

3、  内存管理:

插入元素时,若需要增加内存,首先检查所插入的缓冲区是否还有备用节点,若没有,则再检查map是否还有空间,若还有则配置一个新的缓冲区,若没有,则需要重新配置新的map地址空间。

 

(四)  stack

  1、 特点:只允许从一端移除和新增值,以deque作为stack的缺省底层容器,不允许有遍历行为。

  2、 示例:


  3、也可以用list作为底层容器

定义:stack<int,list<int>> istack;

 

(五)  queue

1、 特点:两端均可访问,但只允许在前段出,后端进。初首末端数据外,不能访问其他元素。以deque作为缺省的底层容器。

  2、 示例:

 

3、也可以采用list作为底层容器,

定义:queue<int,list<int>> iqueue;

 

(六)  heap

  1、特点:分为max-heap和min-heap两种,数据排列成完全二叉树,前者每个节点的值都大于或等于其子节点的值,后者则小于或等于其子节点的值。其中max-heap中最大值在根节点,min-heap最小值在根节点。底层存储结构为vector或者array.

2、示例:

  

 3、相关操作

      Heap的插入和删除,同时还需要调整数据的存储位置,使之符合堆的各元素间大小关系的条件要求。

     make_heap():将一段现有数据转换成heap

     push_heap():加入新的元素到heap

    pop_heap():  将最大的点放入堆尾。并不移除。

    sort_heap(): 将heap中数据从小到大排序,一旦排序则数据不符合heap结构。

(七)  priority_queue

1、特点:基本特性跟queue一致,只有顶端的元素才能被外界取用。其中的元素并非依照被推入的顺序次序排列,而是通过max-heap操作,将元素按照权值从大到小排列。每次取值均为所有元素中的最大值。缺省情况以vector为底层容器。

2、示例:

#include<queue>

#include<iostream>

#include<algorithm>

using namespace std;

int main()

{

   intia[9]={0,1,2,3,4,8,9,3,5};

   priority_queue<int>ipq(ia,ia+9);

   cout<<ipq.size()<<endl;

   for(inti=0;i<ipq.size();++i)

      cout<<ipq.top()<<"";

   cout<<endl;

   while(!ipq.empty())

   {

     cout<<ipq.top()<<"";

      ipq.pop();//移除底部的数据

   }

   cout<<endl;

   return0;

}

结果:

(八)  slist

    1、特点:与list类似,但为单向链表。

2、示例:

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值