STL简介以及STL中的容器

我认为STL(标准模板库)就是对常见数据结构和算法的再封装,以便开发者能更加灵活的使用数据结构和常用算法
通常认为,STL由容器、算法、迭代器、函数对象、适配器、内存分配器 这 6 部分构成

容器

简单理解容器,他就是封装数据结构的模板类
STL中的容器分为三大类,分别是:序列容器、关联容器(排序容器) 以及 无序关联式容器(哈希容器)
注意两点: 1. 容器的分类直接决定了容器内元素的存储方式。序列容器中的元素顺序由数据进入容器的位置决定;排序容器中元素的位置由元素键值的大小决定;而哈希容器元素的位置是由元素的哈希值决定。
2.因容器的存储方式不同,所以使用不同的容器进行相同的操作,所需要的开销完全不同,因此在使用容器之前应当对使用何类型的容器进行充分考虑

序列容器

序列容器主要包括:array数组容器、 vector向量容器、list列表容器、deque双端队列容器 以及 forward_list 列表容器
在五个序列容器中,array容器 和 vector容器 是以数组实现的。不同的是 array 是对普通数组进行的封装,而 vector 是对动态数组进行的封装。这就导致了 array 是不可变长,而 vector 是可变内存长度的数组。
list容器 和 forward_list容器 是以链表的形式实现的。不同的是 list 是双链链表实现,而 forward_list 是单链链表实现的。因此在选用时应优先选择 forward_list列表容器
deque双端队列容器,可以理解为双向队列,能快速的在队列两端进行添加、删除操作。因此当需要频繁在数列前后添加或删除元素时优先考虑 deque 容器。

序列容器主要供选择就两个 vector 以及 list。array勉强算是吧
说一下 list 与 vecto 的不同
1. list 可以使用 sort 对容器内的元素进行排序。而 vector 默认不支持排序
2. list 没有 at 函数,也未重载操作符 []
3. list的内置迭代器无法进行 + 运算。 stl_list.begin() + 3 是错的
vector 与 list 的选取一般情况下相差并不大,但需要进行排序操作时选择list,对空间要求比较高时选择vector

关联容器

排序容器 | 关联式容器 以键值对的形式保存数据。因此关联式容器在查找、访问、插入和删除指定元素的效率会高一些。
哈希容器 | 无序关联式容器 也是以键值对的形式保存数据。但哈希容器不会以键值对容器内的元素进行排序,也因此无序关联式容器在查找指定元素时会有更高的效率,遍历却极为不足。
造成关联式容器 和 无序容器 差异的原因是两者在底层的实现。关联容器底层采用红黑树结构进行存储,而无序容器底层采用的是哈希表的存储结构。由此也就导致了无序容器具有更高的查找效率。
STL中关联式容器主要包括: map、multimap、set 以及 multiset 这4种。
关于这四个关联式容器其实很好理解:
因为关联式容器是以键值对的形式存储数据,所以 键 和 值 的关系就直接决定了这四个容器的构造。 是否允许创建 相同的 “键”, 允许使用 multixxx ,不允许不使用 multi。键值是否保持一致,键值保持一致使用set容器,键值不必保持一致就使用 map容器
无序关联式容器,在所有的关联式容器的基础上加上 unorder_ 前缀,就构成了无序关联式容器。所以无序关联容器在使用上和关联式容器只有细微的差别。在选择上如果如果涉及大量遍历操作优先使用无序关联容器即可。

(容器)适配器

所谓的容器适配器就是在容器的基础上进行的再封装,以使其满足某些特定场景的需求
STL中容器适配器有三个,分别是:stack、queue 和 priority_queue。
stack – 栈 – 先进后出
queue – 队列 – 先进先出
priority_queue – 排序队列 – 权重大的先出

容器适配器必须要清楚以下几点:

  1. 容器适配器是为了满足某一特定的场景进行设计的。
    这特定的场景也就和适配器的名字一样 stack–实现栈操作 queue–实现队列操作
  2. 容器适配器没有内置迭代器,因此要对容器适配器进行遍历就需要逐个移除
  3. 容器适配器是由 序列容器 进行再封装的,因此构建容器适配器的对象一定是一个序列容器
  4. 在容器适配器中使用的容器必须是满足一定条件的(实现相应方法的实现,不必探究)只需要知道stack 只能由vector、deque、list进行构建, queue 只能由 deque、list进行构建 priority_queue只能由deque、vector进行构建。
priority_queue队列默认的入队顺序          
priority_queue 队列创建时,默认指定std::less<T>入队(最大的元素排在队列头,其他元素位置与插入顺序有关。)            
入队元素:3,1,2,6,4,5,priority_queue的入队顺序是               
首先: 3入队, 1,2入队比3小,所以1,2排在3后边(只找最大的,所以1,2不排序)              
3  1  2         
然后:6入队比3大,所以6排在对列头       
6 3 1 2
之后:4,5都没6大排在队列尾
6 3 1 2 4 5
出队: 最大的出队后剩余选出最大的放在队列头
5 3 1 2 4
4 3 1 2
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fstarSea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值