初识STL——基础篇
一、STL到底是什么
STL从广义上分为:容器、算法和迭代器。迭代器是容器和算法的粘合剂。
又细分为六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器;彼此间可以组合套用。
容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰仿函数。
总的来说,STL不仅是一个可复用的组件库,而且是包装了算法和数据结构的软件框架。
二、STL三大组件
1、容器
-
数组(array)、链表(list)、栈(stack)、队列(queue)、集合(set)、映射表(map)
-
根据数据在容器中的排列特性,分为序列式容器和关联式容器。序列式容器:强调值得排序,如Vector、Deque、List;关联式容器:元素在容器中并没有保存元素置入容器时得到逻辑顺序,如Set、Map。
2、算法 -
质变算法:用了之后会改变元素内容的方法,如替换、删除;
-
非质变算法:用了之后不会改变元素内容的方法,如查找、遍历。
3、迭代器到底是个啥东西呢?
迭代器它是一个抽象的设计概念,在程序里实际并没有直接对应于这个概念的实物。它是一种方法,能够遍历某个容器当中的元素,而又不用暴露该容器的内部表述方式。而我们操作的时候,可以把它理解为一个指针来操作。
三、常用容器
1. string容器(在头文件中)
-
C风格字符串(以空字符串结尾的字符数组)
-
string和C风格字符串对比:char是一个指针,String是一个类,String封装了char,管理这个字符串,是一个char的容器;String封装了很多实用的成员方法,如find、copy、insert等;不用考虑内存释放和越界,String管理char所分配的内存,都由String类负责维护。
-
String容器常用操作
a.构造,赋值assign
b.对字符存取[]和at的区别
[]访问越界,程序直接挂掉;
at访问越界,则抛出异常out_of_range。
c.char*可以隐式的转换为String,反之不行。
2.Vector容器——单端数组,动态空间
- 动态增加大小,并不是在原空间之后续接新空间(因为无法保证原空间之后尚有可配置的空间),而是重新找一块更大的新内存空间,然后将原数据拷贝到新空间,并释放原空间。因此,对Vector的任何操作,一旦引起空间的重新配置,指向原Vector的迭代器就都失效了。
- Vector采用的数据结构——线性连续空间
- 常用操作(所有容器存在的操作基本一致,细节上可能略有差异)
a.构造、赋值,如vector<int*> v(v1.begin(),v1.end()),初始化v;
b.计算容器大小v.size();重置容器大小v.resize(n);
c.交换两个vector对象的元素,v.swap(v1).
-Vector迭代器是随机访问的迭代器,支持跳跃式访问。
3.deque容器——双端数组,没有容量
- deque容器实现原理
- 中控器:一块连续内存空间,每个元素为一个指针,指向另一段连续内存,称为缓冲区——deque的存储空间的主体。
- 当deque容器中0x01指向的空间满后,中控器会再找一块内存接着插入元素,所以deque容器没有容量这一说。
4、list容器——循环双向链表
- list迭代器必须具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators.
- 插入和删除操作,不会造成原有list迭代器的失效,List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响——这与Vector是不同的。
- 所有不支持随机访问的迭代器,不可以用系统提供的算法;如果不支持用系统提供的算法,则这个类内部会提供。如:list<int*>L,sort(L.begin().Lend())是错误的,正确用法为L.sort()。
- 对于自定义数据类型排序时,必须要指定排序规则。
5.Set/multiset容器——关联式容器,红黑树
- 所有元素会根据元素键值自动被排序;
- Set的元素既是键值又是实值;
- Set不允许两个元素有相同的键值;
- 不能通过Set的迭代器改变Set元素的值,Set的迭代器是一种const_iterator;
- multiset容器——与Set唯一差别:允许键值重复。
来源:CSDN
作者:跟着小宋一起学
链接:https://blog.csdn.net/qq_31991061/article/details/103463885