C++STL容器及其优缺点介绍

容器类型

以前的11个容易分别是deque、list、queue、priority_queue、stack、vector、map、multimap、set、multiset和bitset(bitset是在比特级处理数据的容器)。C++11新增了forward _lst、unordered_map、unordered_multimap、unordered_set、unordered_multiset。

容器优缺点

一 序列容器

vector

vector是数组的一种表示,它提供了自动内存管理功能,可以动态改变vector对象的长度,并随着元素的添加和删除而增大或缩小。其在尾部添加和删除的时间是固定的,但是在头部或中间插入元素的复杂度为线性时间。
vector模板类是最简单的序列类型,除非其他类型的特殊优点能够更好地满足程序的要求,否则应使用这种类型。

deque

双端队列。在STL中,其实现类似于vector容器,支持随机访问。主要区别在于,从deque对象的开始位置插入和删除元素的时间是固定的,而不是像vector那样是线性时间的。
但是:deque为了实现在首尾插入和删除元素,其设计比vector更复杂。所以deque对元素的随机访问速度比vector慢。

list

双向链表。除了第一个和最后一个元素外,每个元素都与前后的元素相连接,这意味这可以双向遍历链表。list和vector之间的关键在于 ,list在链表中任一位置进行插入和删除的时间都是固定的,list强调的是任一位置元素的快速插入和删除
但是list不支持数组表示法和随机访问。链表的插入和删除只是改变链接信息,所以快和不支持随机访问。

forward_list(C++11)

单链表,每个元素只链接下一个节点,而没有链接到 前一个节点,因此forward_lis只需要正向迭代器。

queue

queue类是一个适配器类。queue模板让底层类(默认为deque)展示为典型的队列接口。queue的限制比deque更多。不仅不支持随机访问,甚至不允许遍历队列。他只能将元素添加到队尾、从队首删除元素、查看队尾和队首的数值、检查元素数目和测试队列是否为空。(这就是阉割版的deque,但是用在纯队列中效率更高)

priority_queue

这是另一种适配器类,其支持的操作和queue相同。区别在于,在priority_queue中,最大的元素被移动到队首,内部区别在于,其默认的底层是vector。并且可以修改放在队首元素的比较方式。

stack

与queue相似,stack也是一个适配器类,它给底层vector提供了典型的栈接口。stack比vector的限制多,不允许随机访问栈元素,不能够允许遍历栈,只是把使用限制在栈的基本操作。既可以将压入栈顶,从栈顶弹出元素、查看栈顶的数值、检查元素数目和测试是否为空。栈为先进先出。

array

这并非STL容器,因为其长度是固定的。不能用pushback insert之类的操作。

二 关联容器

关联容器将值和键关联在一起,并使用键来查找值。
其优势是提供了元素的快速访问,与序列相似,可以允许插入新元素,但是不能插入到指定位置,因为关联容器内部有确定位置存放的算法(以便于其能够快速检索信息)。
关联容器是使用某种树结构。
提供了set multiset map multimap四种关联容易。

set

其是关联集合,和map的区别在于:set的值类型和键类型必须是相同是,而map的值和键类型可不同,可反转,可排序,且键是唯一的。所以不能存储多个相同的值。
其定义形式为 set A; set<string less>A。默认会按照由小到大的顺序;

multiset

其键和值的类型相同同,同一个键可能和多个值相关联。

map

其键和值的类型可不同,同一个键只能和一个值相关联。和set的区别在于:set的值类型和键类型必须是相同是,而map的值和键类型可不同

multimap

其键和值的类型可不同,同一个键可能和多个值相关联。

三 无序关联容器

无序关联容易也是将值和键关联起来,并使用键来查找数值。

但是底层的区别在于,关联容器是基于树结构的,而无序关联容器是基于数据结构哈希表的,这旨在提高添加和删除元素的速度以及提高查找的效率。

其类型包含了unordered_set unordered_multiset、unordered_map、unordered_multimap。

参考:Stephen Prata《C++Primer Plus》16.4泛型编程。 16.4 16.5 16.4

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值