STL常用容器及使用总结

一、STL常用容器介绍

1、序列容器

序列容器按照元素的线性顺序存储,存储顺序固定的一种容器类型。

vector 动态数组

存储方式:采用顺序存储

特点:支持随机访问,其中成员存储在物理意义上具有连续性, 可以自动增长。在末尾插入和删除元素具有O(1)的时间复杂度,但是对其他位置的插入删除则需要线性的时间,即时间复杂度为O(n)。

deque 双端队列

存储方式:分块存储,每个定长数据块内部是顺序存储方式,同时数据块之间采用双线链接的形式组织在一起,形成逻辑上的连续。

特点:支持随机访问。支持在两端进行高效的插入和删除操作(时间复杂度为O(1)。也支持在序列中间进行插入和删除操作,但是时间复杂度为O(n),如非必要最好不要这样使用deque,可以采用其他更符合需求的容器。

list 双向链表

存储方式:链式存储

特点:不支持随机访问(访问位置i的元素需要从头或尾开始遍历过去)。支持快速插入和删除任一元素。

forward_list 单向链表

存储方式:链式存储

特点:不支持随机访问,同样支持快速插入和删除任意位置元素。比list节省空间,但是遍历只能从头开始单向遍历。

2、关联容器

关联容器是一种基于键值(key)进行高效的元素查找和插入的一种容器类型。

关联容器按照键值是否有序可以分为有序关联容器无序关联容器

有序关联容器内部键值按照某种预定义的顺序插入元素,例如按升序排序。下面介绍的几种常用有序关联容器,基本使用红黑树(一种自平衡的二叉搜索树)实现。

而无序关联容器虽然不一定会按照插入顺序排列,但是内部键值排列是无序的。下面介绍的几种无序关联容器基本使用哈希表来实现。

set 有序集合

存储方式:基于红黑树实现

特点:不允许元素重复。内部键值有序排列。插入、删除和查找操作的平均时间复杂度为O(log n)。

使用场景:可以用于需要元素在插入时按照某种规律自排序,并且无重复元素时候可以使用。

multset 有序集合(但允许元素重复)

存储方式:基于红黑树实现

特点:允许元素重复的有序集合。内部成员有序排列。插入、删除和查找操作的平均时间复杂度为O(log n)。

使用场景:可以用于需要元素在插入时按照某种规律自排序,并且有重复元素时候可以使用。

map 有序键值对容器

存储方式:基于红黑树实现

特点:不允许键值key重复。内部元素按照键值有序排列。插入、删除和查找操作的平均时间复杂度为O(log n)。

使用场景:可以用于需要一对一的映射关系,并且需要元素在插入时根据键值按照某种规律自排序的时候使用。

multmap 有序键值对容器(但允许键值重复)

存储方式:基于红黑树实现

特点:不允许键值key重复。内部元素按照键值有序排列。插入、删除和查找操作的平均时间复杂度为O(log n)。

使用场景:可以用于需要一对多的映射关系,并且需要元素在插入时根据键值按照某种规律自排序的时候使用。

unordered_set 无序集合

实现方式:哈希表

特点:不允许元素重复。使用哈希表实现,插入、删除和查找操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。

使用场景:可以用于存储一组不重复的数据,对数据排列顺序无要求,需要频繁查找某个数据是否存在的情景。

unordered_multiset 无序集合(元素可重复)

实现方式:哈希表

特点:允许元素重复。使用哈希表实现,插入、删除和查找操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。

unordered_map 无序键值对容器

实现方式:哈希表

特点:不允许键值重复。使用哈希表实现,插入、删除和查找操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。

使用场景:可以用于存储一对一的映射关系,对数据排列顺序无要求,需要频繁查找某个键值所对应的数值的情景。

unordered_multimap 无序键值对容器(键值可重复)

实现方式:哈希表

特点:允许键值重复。使用哈希表实现,插入、删除和查找操作的平均时间复杂度为 O(1),最坏情况下为 O(n)。

使用场景:可以用于存储一对多的映射关系,对数据排列顺序无要求,需要频繁查找某个键值所对应的数值的情景。

关联容器总结

上述介绍的八种关联容器可以分为两类集合(set)和映射(map)。

其中set的无序版本是unordered_set,键值可重复版本是multset,无序且键值可重复版本是unordered_multset。

map的无序版本是unordered_map,键值可重复版本是multmap,无序且键值可重复版本是unordered_multmap。

3、容器适配器

可能好多人都在找,我们常用的队列queue(先入先出FIFO的一种线性结构)和栈stack(后进先出 LIFO的一种线性结构)为什么没有被介绍?事实上,它们在STL中并不属于基础容器,而是属于容器适配器。

容器适配器是序列容器或关联容器的变体,它在基础容器的基础上对接口进行限制。需要注意的是,容器适配器不支持迭代器,因此无法与 C++ 标准库算法一起使用,详细请见下面使用的相关总结。

二、常用容器的使用

下面详细总结下,不同容器的增删改查,以及遍历等操作常用的相关函数的使用方法。

vector

vector的常用方法总结-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值