STL:
1:STL是C++里面的组件,也是C++里面非常重要的一部分。
2:STL就是正对泛型程序设计的思想设计出来的。
3:任何一个C++编译器都对STL进行了实现。
4:不会用STL就相当于不会C++。
泛型程序设计:
特点:
1:程序尽可能通用(有了面向对象,泛型)
2:将算法从数据结构中抽象出来,成为通用的算法(比如冒泡排序只针对数字)。
STL是什么(做了什么):
1:包含常用的数据结构(例如数组,二叉树,列表……)。
2:包含常用的基本算法
3:提供了一套可扩展框架(可扩展的泛型编程的框架,基于数据结构和算法的框架)
STL六大组件:
1:容器:
1:vector:可变长数组。
1:数组是连续的空间,这种数据结构就称之为数组。
2:这样存储数据的好处在于是有序的,我们可以随机访问(想访问下标是多少的就可以访问到)。数组的随机访问速度是最快的。
3:O1代表时间复杂度(我要几步操作才能达到我们想要的结果。),O1代表一步到位,O2代表两步到位。数组的插入复杂度是On(需要n步)。
4:数组后面添加元素就是O1,很快,最后面删除也是O1,但是在中间插入和删除就会编的很慢,他的特点是访问和添加快,中间的操作的时候就变得非常慢。
5:vector只是使用了一些技术使之看起来可变长,但它实际还是一个数组。vector的变长是非常复杂的,是On。如果是使用的大量数据,最开始就最好分配足够的空间。不认要分配很多次,很麻烦。
2:deque:双端队列
1:他也是使用数组来完成的,但他和vector是不一样的,vector是一维数组,deque里面有一个map(认为是初始化的一个数组,装的是指针,指向其他数组的首地址),通过这种方式实现双端队列,这使得往前增加还是往后增加时间复杂度都是O1。他也是有序的,也可以做随机访问(这种随机访问并不是O1,至少O3以上)。
2:deque的访问相对于vector是非常慢的,但相对于list还是会快一些。
3:list:列表:
1:列表分为单向列表和双向列表(不同STL版本的可能不一样,但大多都是用的双向列表)
2:列表里面每一个节点都有一个next,最后一个元素的next为空,列表的访问时间复杂度就是On的。必须挨个访问。
3:好处在于他的数据插入和删除是特别快的,删除最快(O1)。但是访问是非常慢的。他的作用就是拿来插入和删除用的。
4:双向列表,就是每个节点既有next也有back,相互指向。
5:双向环形列表:最开始的一个节点的back和最后一个元素的next相互指向,形成环形的结构,称之为双向环形列表。
注意:上面三种(vector,deque,list
)
都是有序的,称之为序列式容器,下面几种(set,multiset,map,multimap)称之为关联式容器(都是通过二叉树实现的)。
选择原则:
1:频繁地插入和删除,不用再序列内部长距离调转应该选择list。
2:在vector头部和中部插入删除效率低,在尾部插入删除效率高。
3:deque在头部和尾部插入与删除效率高,世纪访问速度比vector低(一般用的少)。
二叉树:二叉树分为有序树(每个节点都是按大小排列的,比原来节点数小的在左,大的在右(这样可能出现单支的现象))和无序树。红黑树用的比较多(他会将顺序打乱),他保证支节平衡。
二叉树是用来做搜索的,这种结构非常适合做二分法。二分法是搜索最快的方法。
4:set:通过序列号来随机访问当中i的元素。
5:multiset:里面的序号不能重复
6:map:通过key和value来访问。
7:multimap:里面的key不能重复
2:适配器:
1:适配器是用来改变容器,迭代器或者函数对象接口的组件
2:分类:
1:容器适配器:stack等。
1:栈:
2:队列:
3:优先队列:
2:迭代器适配器:
1:反向迭代器:
2:插入迭代器:
3:IO迭代器:
3:函数适配器:
1:函数对象适配器:
2:成员函数适配器:
3:普通函数适配器:
3:适配器并不是相当于一个派生类,适配器做的远不止添加东西,也可以屏蔽一些接口,他是一个全新的类,它可以在另一个类之上进行一些修改。
3:算法:
1:算法头文件:<algorithm>。里面包含STL里面所有的算法,它可以作用于我们任何一个容器上面(因为有迭代器的存在)。
4:迭代器(smart point):
1:相当于一个小型智能的指针,用于链接我们的容器和算法(把容器里面的元素抽象成迭代器,算法操作迭代器)。
2:正是有迭代器,才使得我们的算法可以通用。
5:函数对象:
1:实现一些可扩展的功能
6:分配器:
1:实现一些可扩展的功能