STL是一套标准,只要实现了套标准就是一个STL,是一套基于泛型程序设计的一套框架,这套框架帮我们实现了基本的容器和算法。
STL分为六大组件,容器,算法,迭代器,函数对象,分配器。
STL中最基本的三大组件,容器,算法,迭代器。容器是用来存储元素的,算法是用来操作数据的,中间有个迭代器是用来将容器和数据连接起来操作的。迭代器是一个Smart point 里面做了一些类似指针的操作,迭代器是用来连接容器和算法的,将容器中的所有元素都抽象成一个迭代器,使用算法来操作迭代器。
函数对象和分配器是用来实现STL的可扩展功能。
容器:STL中的标准容器是Vector(向量),deque(双端队列),list(列表)—>序列式容器。
set/multiset(集合),map/multimap(映射)->关联式容器。
基础数据结构:数组—>数组是一段连续的空间,这种的一种数据结构就叫做数组。数组是有序的,并且是可以随机访问。其实所有的数据结构都是可以进行随机访问的,但是数组的访问速度是最快的。
数组的特性:1.随机访问的速度很快。2.在尾部增删数据非常的快。3.但是做任何数组中间操作都是非常的慢的。4.数组是没有可变长的。
vector(向量):vector的本质就是一个数组,Vector是怎么样来实现变长的了。比如,Vector初始化的时候申请了5个空间的数组,当第5个数填满的时候,在分配第6个数的时候就会在创建一个长度*2的数组,然后在将原来数组当中的数据Cpoy过来。这样的话Vcetor其实做了一个On的操作,操作速度就变低了。Vector数组是在尾部增长。
deque(双端队列):deque其实也是用数组来完成的。双端队列就是在数组的前后增加时间复杂度都是O1。在使用deque的时候,因为deque内部有map的存在,在访问的时候,操作将不在是O1,最少操作数至少是O3。deque的访问较之于vector是非常慢的,在需要使用数组的时候,尽量使用vector。
单项链表:
单项链表都是有和头和尾的,没个区块当中分为两个部分,Head和Next,Next会指向下一个区块的Head,当到达Last的时候,下一个Next=0。链表的访问非常的慢,比如我要访问链表中的第三个元素,它会从头开始索引。它比Deque还要慢的多的多。因为链表之间是靠指针指向的,所以单项链表对数据的插入会很快。删除速度会比插入速度更快。链表就为了插入和删除而存在的。
双向链表:
在双向链表当中,除了会指向下一个模块,还会指向上一个模块。如果,链表的两头都是NULL,那么就是一个标准的双向链表。如果两个链表的首尾相连,就会形成环形双向链表。
list(链表):在STL当中使用的大部分都是双向列表。
在STL当中这三种都是序列式的容器,里面的每一个元素都是有序的,里面的每个元素都是有序的。
List,Vector和deque三个序列式容器在使用的时候应该怎样来选择了。
在需要频繁的插入和删除的时候,里面不需长距离的跳转,因该选择List,其他的情况下基本都是使用Vector。deque的话很少可以用到的。
关联式容器:set/multiset(集合),map/multimap(映射)->内部都是通过二叉树来实现的。