STL其实也不是什么高深的东西,如果会使用string类的话,可以提升你对STL的理解。
我的认为STL是一个模板,把功能都已经写好了,你只需要套用就Ok了。毕竟STL全称就是标准模板库。
我们学C++时,就知道它有面向对象和泛型编程的思想。STL目的就是提高复用性。
STL的基本概念
STL广义分为:容器、算法、迭代器
容器和算法通过迭代器进行链接
STL大体分为六大组件:容器、算法、迭代器、仿函数、适配器、空间适配器
编辑
我就单独介绍一下容器和适配器:
编辑
编辑
迭代器在使用的时候类似于指针,我在理解的时候,就把他看做指针来用,这样方便理解。
编辑
这些迭代器中比较常用的是双向迭代器和随机访问迭代器,这两个相较于其他的迭代器功能强大。
接下来进入容器的介绍,这些容器的构造都差不多,我就专注说明vector,其余的可以类推:
STL
vector
在理解上我把它看做一个数组,和数组的主要区别在于,vector可以动态扩展,但是数组是一个静态空间。如图所示:
编辑
构造函数
分为默认构造和拷贝构造。
1.需要把vector类名调用才能使用这个容器,每一个容器有不同的类名。
2.默认构造,需要写明你用的是什么数据类型,我这用的是int。
3.我这个对象v1,调用函数,看上面的图,push_back,从数组后端插入。
三种遍历方式
1.第一种遍历方式:
v1.begin()起始迭代器,这个迭代器指向容器中第一个数据 v1.end()结束迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
1.使用迭代器,把数组的前端第一个元素和元素末端(不是最后一个元素),获取他们的位置(我个人认为)。
2.以指针的方式,去访问每一个元素。
这种方式遍历其实可以简化一下,把1的部分融入遍历里面,我以调用函数的方式来展示:
1.这个是引用
2.用for循环的方式,可以简化一下代码,思想和以前遍历是一样的,只是这里是指针。
第三种遍历方式:使用STL提供标准遍历算法 头文件algorithm,需要使用一个回调的技术,在此之前需要写一个函数进行输出
可以看出,特别的简略,其实使用的是algorithm里面的一个函数,写Print()的作用是进行一个调用(应该是仿函数的调用)。
其他的构造方式:
接下来说一下自定义数据类型和指针的存入。
自定义数据和指针
自定义数据:
1.自定义的部分
2.通过回调函数进行输出
指针:
1.使用指针
2.在这里开始解指针
赋值操作
容量和大小
插入和删除
这里插入和删除需要使用迭代器,我在这里演示一下:
迭代器只是提供一个位置信息,然后进入一个数据操作
数据存取
互换容器
互换容器,可以缩减空间的使用,比如你一开始申请10000的空间,只存入了3个数据,就造成空间的浪费,你使用互换容器,自己和自己互换,就可将空间变为3.
预留空间
deque
vector和deque差不多,但deque是两端开口的。
deque和vector差别在于:
其内部工作原理:
构造函数
赋值操作
大小操作
插入和删除
数据存取
排序
stack
把它看做栈就可以了
queue
把它看做队列就行
list
list是一个链式存储,STL里面的是双向循环链表
list的优点: ·采用动态存储分配,不会造成内存浪费和溢出 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素 list的缺点: ·链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大 List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。 总结:STL中List和vector是两个最常被使用的容器,各有优缺点
构造函数
赋值和交换
大小操作
插入和删除
数据存取
反转和排序
set/multiset
我赶紧挺稀罕这个容器的,主要是他可以帮你排序,排序方法是从小到大,但是你也可以帮他规定排序顺序。
构造和赋值
大小和交换
插入和删除
查找和统计
排序方法
如果是自定义类型
pair
map/multimap
总结
我大部分的都是我课程学习的截图,因为和我开头说的一样,这些你只要懂一个vector,其余的就是附加在后面的知识点,区别的就是各个容器的功能。希望可以帮助大家,我后面会写一下我用STL的题目,帮大家理解。