16.4.5 容器种类(外1:7种序列容器类型)

1.vector模板:

  • 在vector头文件声明
  • ### 在尾部添加和删除元素的时间是固定的,但在头部
  • ### 或中间插入和删除元素的复杂度为线性时间
  • vector是可反转容器概念的模型。由此增加两个类方法:
    1.  rbegin():返回一个指向反转序列的第一个元素的迭代器
    2.     rend():返回反转序列的超尾迭代器

2.deque模板(双端队列):

  • 在deque头文件种声明
  • ### 在STL中,其实现类似于vector容器,支持随机访问。主要区别在于
  • ### 从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间的
  • ### 因此如果多数操作是发生在序列的起始和结尾处,则应考虑使用deque数据结构
  • ### 以上实现的代价是,增加了设计的复杂度,所以尽管二者都提供对元素的随机访问和在序列中部执行线性
  • ### 时间的插入和删除操作,但vector容器执行这些操作时速度要快些

3.list模板(双向链表):

  • 在list头文件中声明
  • ### list和vector之间关键的区别在于,list在链表中任一位置进行插入和删除的时间都是固定的
  • ### 因此vector强调的是通过随机访问进行快速访问,而list强调的是元素的快速插入和删除
  • 与vector相似,list也是可反转容器
  • 与vector不同的是,list不支持数组表示法和随机访问
  • 与矢量迭代器不同,从容器中插入或删除元素后,链表迭代器指向的元素将不变

除序列和可反转容器的函数外,list模板类还包含了链表专用的成员函数,部分如下(通常不必担心

Alloc模板参数,因为它有默认值):

一些list成员函数

函数 说明
void merge(list<T, Alloc> & x)

将链表x与调用链表合并。两个链表必须已经排序。合并后的经过排序的链表(合并后自动排序)保存在

调用链表中,x为空。这个函数的复杂度为线性时间

void remove(const T & val) 从链表中删除val的所有实例。这个函数的复杂度为线性时间
void sort() 使用<运算符对链表进行排序;N个元素的复杂度为NlogN
void splice(iterator pos, list<T, Alloc> x) 将链表x的内容插入到pos的前面,x将为空。这个函数的复杂度为固定时间
void unique() 将连续的相同元素压缩为单个元素。这个函数的复杂度为线性时间

说明:### 一:insert()和splice()之间的主要区别在于:insert(0将原始区间的副本插入到目标地址,而splice()则将原始区间移动目标地址

           ### 二:splice()方法执行后,迭代器仍有效(指向同一个元素)

           ### 三:使用非成员sort函数需要随机访问迭代器。因快速插入放弃了随机访问功能,所以不能用,转而使用类中的成员版本

### sort()、merge()、unique()方法还各自拥有接受另一个参数的版本,该参数用于指定用来比较元素的函数。

### remove()方法也有一个接受另一个参数的版本,该参数用于指定用来确定是否删除元素的函数

### 上述两个参数都是谓词函数

4.forward_list模板(单向链):

  • C++11新增
  • 实现单链表:单向,只需要正向迭代器
  • 不可反转

5.queue模板:

  • 在头文件queue(以前为queue.h)中声明
  • ### 是一个适配器类(ostream_iterator模板也是一个适配器类,让输出流能够使用迭代器接口)
  • ### queue模板让低层类(默认为deque)展示典型的队列接口
  • 限制比deque多:
    •  不允许随机访问
    •     不允许遍历队列
  • ### 它把使用限制在队列的基本操作上
  • ### queue的操作:
    • bool empty() const 如果队列为空,则返回true;否则返回false
      size_type size() const 返回队列中元素的数目
      T & front() 返回指向队首元素的引用
      T & back() 返回指向队尾元素的引用
      void push(const T & x)

      在队尾插入x

      void pop() 删除队首元素
         

 

 

 

 

 

 

 

 

6.priority_queue模板:

  • 在queue头文件中声明,是另一个适配器类
  • 支持的操作与queue相同
  • ### queue与queue的主要区别在于,在priority_queue中,最大的元素被移到队首。
  • ### 内部区别在于,priority_queue默认的底层类是vector

### 可以修改用于确定哪个元素放到队首的比较方式,方法是提供一个可选的构造函数参数:

priority_queue<int> pq1;    // default version
priority_queue<int> pq2(greater<int>);    // use greater<int> to order

### greater<>()函数是一个预定义的函数对象

7.stack模板(栈):

  • 在头文件stack(以前为stak.h)中声明
  • 与queue相似,它也是一个适配器类,它给底层类(默认为vector)提供了典型的栈接口。
  • 限制多余vector:
    •  不支持随机访问栈元素
    •     不能遍历栈
  • 仅支持栈的基本操作:
    • stack的操作
    • 方法 说明
      bool empty() const 如果栈为空,则返回true;否则则返回false
      size_type size() const 返回栈中的元素数目
      T & top() 返回指向栈顶元素的引用
      void push(const T & x) 在栈顶部插入x
      void pop()

      删除栈顶元素

 

 

 

 

 

 

 

array模板(C++11):

  • 在头文件array中定义
  • 非STL容器(原因是长度固定,没有调整大小的操作)
posted @ 2020-08-23 09:39  孱陵  阅读(277)  评论(0编辑  收藏  举报