【STL源码剖析】总结笔记(2):容器(containers)概览

本文介绍了STL容器的结构与分类,包括序列式容器如vector、deque、list和forward-list,以及关联式容器如set、map、multiset和multimap。还探讨了容器间的关系,为深入理解STL内部实现打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

00 写在前面

容器(containers)是STL的重要组成部分之一,也是非常值得我们深入研究的部分。各种vector、map、set的使用极大地提高了我们解决问题的效率。

每个容器内部都有着其独特的实现方式以及一些需要我们了解的要点,这些会是文章中的侧重点。

01 容器的结构与分类


概述

容器大致分为序列式容器(Sequence),关联式容器(Associative)和无序容器(Unordered),无序容器也可以归为关联式容器内。

在这里插入图片描述


分类


序列式容器(Sequence)
  1. array:数组,是一种固定大小的结构,静态空间,配置后大小就不能改变。
  2. vector:动态数组,单向开口的线性连续空间,可动态配置空间,原理是每次扩容时二倍增长,再将原空间数据拷贝到新空间中。
  3. deque:是一种双向开口的线性连续空间,可在头和尾进行插入和删除操作。
  4. list:链表结构,不是线性连续空间,使用指针寻址,这里指的是双向链表。
  5. forward-list:单向链表
  6. stack/queue:栈和队列,底层都是使用双向开口的deque包装后实现的。

关联式容器(Associative)
  1. set/multiset:以红黑树为基础的结构,可以存放key。对于set来说key不可以重复,multiset的key可以重复。
  2. map/multimap:以红黑树为基础的结构,可以存放key和value,对于map来说key不可以重复,multimap的key可以重复。
  3. unordered set/multiset:以哈希表为基础的结构,可以存放key。对于set来说key不可以重复,multiset的key可以重复。
  4. unordered map/multimap:以哈希表为基础的结构,可以存放key和value,对于map来说key不可以重复,multimap的key可以重复。

对比关系:

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(logn)O(logn)
std::multiset红黑树有序O(logn)O(logn)
std::unordered_set哈希表无序O(1)O(1)
映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可修改O(logn)O(logn)
std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

02 容器间的关系

先来看一张关系图:

在这里插入图片描述

这里的缩进显示代表着基层与衍生层的关系,而衍生不是继承,而是复合。

比如heap和priority里面有vector作为基层。set、map有红黑树作为基层。

也有一些非标准的容器在里面,比如slist,hash开头的等等。在C++ 11中slist改名为forward-list,hash开头的全部改为unordered开头。

注:这里的sizeof()埋一个小伏笔,后面会有具体大小的对比。另外GNU4.9有很多设计变得复杂了,比如使用了很多继承,但实际功能区别不大。


03 总结

在了解了容器的大致内容之后,我们可以从最熟悉的vector入手来看看内部的实现细节。

而在其他容器中也会有很多值得学习的地方,比如list中会体现出迭代器(iterators)设计的精妙之处,在set和map中会体现红黑树的实现等等,后续单独总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值