今天来简单介绍一下STL的简单实现,虽然平时对于STL的应用很多,但是很多时候对于其底层的一些情况并不是十分清楚,今天就我对STL的一些简单认知做了一个梳理,希望大家批评指正:
对于几种常用STL的底层实现简单描述一下:
向量容器vector 查询时间复杂度为O(1) 内存结构数组
尾部插入和删除时间复杂度O(1)
头部插入和删除的代价较高
特点:内存可两倍增长的动态数组,
数据结构:线性连续空间
注:动态增加的空间并不是在原空间的基础上添加一段新的内存空间,而是重新分配一段连续的内存空间,新空间是原空间大小的两倍
双端队列deque 尾部和头部插入和删除的 链表
时间复杂度都为O(1)
特点:其数据结构是一种双向开口的存储空间分段连续的数据结构,每段数据空间的内部是连续的,但是每段数据空间不一定连续
注:与vector的区别:1.允许在常数时间内对其首尾端进行插入和删除
2.因为其数据结构的特性,因此不存在空间的不足,若空间不足只需要在链接一段新的数据空间即可
双向链表list 对任意位置元素的插入和删除 双端数组
时间复杂度都为O(1)
查询元素的代价较高
特点:其数据结构是一种双向的环状链表
插入和接合都不会对原来的list迭代器造成失效
删除操作也仅仅是”指向被删除元素“的迭代器失效,其他的迭代器不受影响
因此也就导致,随机访问会很慢
集合set 由节点组成的红黑树,每个节 二叉树
点都包含着一个元素,具有
快速查找的能力,但他是以
牺牲插入和删除的效率为代价的
底层使用平衡的搜索树,红黑树实现
set中的元素都是随机的,并且还会存在默认的升序和降序
set中的内部以键值对的方式存储,只不过键和值是相同的而已
映射map 由{键,值}对组成的组合, 二叉树
以某种作用于键对上的谓词排列,
具有快速查找的能力
特点:map中的Key是唯一的
数据结构:是由红黑树变体的平衡二叉树数据结构
提供基于Key的快速检索能力
元素插入是按照排序规则插入的,不能指定位置插入
对于迭代器来说能修改实际值,不能修改键值
根据Key快速查找值的时间复杂度是O(log2n)
注:map中的键值为一,不可重复,通过Insert的返回值Bool类型,可以判断出是否插入成功
例子:insert(make_pair(int,int)) 此种方法即可判断