C++ STL标准库容器介绍

容器分类

 

序列容器

vector

初始分配一块连续内存,必要时可自动增加空间的数组;只能在尾部进行进行操作,体现在push_back和pop_back,支持随机访问[]和at();存取快,插入和删除慢。

list

双向链表,包括前后驱指针,无需指定特定大小内存可以自由伸缩,内存不连续,支持任何位置插入和删除元素,可以在两端进行push和pop操作;不支持随机访问,只能从头或者尾部开始,内存占用比vector多。

deque

双端队列,合并了vector和list的功能,但是内存占用比这两者都多;

使用选择:

  •  如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  •  如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  •  如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

 

关联容器

关联容器使用的使用二叉树(红黑树),以键值方式保存数据

Set:

内部以链表的方式组织(其实可以将set 也看成是一种key-value关系的存储,只是它只有键没有值。它是map 的一种特殊形式),每个元素被称为集合的实例,不允许有重复值,插入和删除比vector快,但尾部追加和查找币vector慢。

map

提供了一种“key-value”关系的一对一数据存储能力,key不能重复,且按照一定顺序排序,由于其实按链表方式存储,所以其继承了链表的优缺点。

multisetmultimap

对set和mapde扩展,允许集合里有重复的元素;

Unordered*

代表集合元素无序;

 

容器适配器

  1. 容器适配器是容器的接口,可以理解成容器的模板,它本身并不直接保存元素,而是“它保存容器,容器再保存元素”,所以它是通过调用容器去实现保存的功能。
  2. STL提供了三种适配器(栈stack 、队列queue 和优先级priority_queue ),可有由某一种顺序容器去实现,默认下stack 和queue 基于deque 容器实现,priority_queue 则基于vector 容器实现。当然在创建一个适配器时也可以指定具体的实现容器,创建适配器时在第二个参数上指定具体的顺序容器可以覆盖适配器的默认实现。
  3. 不是所有顺序容器都能实现所有的适配器,因为没中适配器的特性不同:
    • stack是后进先出,可以由任何一种顺序容器去实现,因为顺序容器都可以提供栈的操作要求:push_back、pop_back、back。
    • queue是先进先出,要求其关联的基础容器必须提供pop_frot操作,因此其不能建立在vector容器上;
    • priority_queue要求容器提供随机访问的功能,因此不能建立在list容器上。

 

速度比较

插入和删除:

List > set&map > vector;         // 插入移动有少到多。他们都是链式结构的,但是list线性的,关联容器是二叉树,vector不是。

检索:

Vector > set&map > list;         // 因为vector是连续存储,list需要逐个搜索,set/map是log(N);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值