空间配置器就是用来处理 容器的内存空间的开辟和释放的
1.序列式容器:我们按什么顺序将数据存到容器中,数据在容器中就按什么顺序排列
2.关联式容器:数据在容器中的排列顺序和我们存进去时的数据可能不一样
3.质变算法:算法运算过程中对参与运算的元素进行更改
4.非质变算法:算法运算过程中不会对参与运算的元素做出任何的改变
算法要通过与容器对应的迭代器才能够访问容器中的元素(数据)
能够进行++操作叫做能够前向操作,能够进行--操作叫做能够后向操作
STL为什么能够诞生? --- 为了提高代码的复用性
for_each:遍历算法
iterator:迭代
STL标准模板库中为我们提供了一个标准数组模板使用 --- Vector
使用标准数组模板的语法:
1.包含这个容器的头文件:
2.创建一个容器 : vector<容器中存放的数据类型> 容器名;
其实这个就和我们自己用类模板实现的数组一样
1.包含写有数组类模板的.hpp文件
2.通过这个类模板实例化一个对象(数组),然后类模板实例化的方式是:
类模板名<赋给类模板参数的类型> 对象名
只不过STL为了避免每一个人都写一遍这个,直接帮我们准备好了一个标准数组类模板
这个数组类模板的模板名是 vector ,然后模板参数列表中只有一个泛型参数
通过这个vector类模板实例化的对象能够实现数组的一系列功能
这个vector类模板又被我们称为vector容器
通过这个vector容器对象(vector类模板对象)调用的这种插入方法是尾插法(在数组中的最后一个元素后买面插入)
创建一个迭代器对象(指针)的方式:
1.首先我们要声明这个迭代器对象是在那个容器作用域下的:
容器名<赋值给容器的模板参数的类型> ::
2.其次我们要声明我们创建的是一个迭代器对象:在上面的作用域下写一个迭代器关键词 iterator
3.创建一个迭代器对象(指针)来指向容器中的数据(元素):直接上面两步写完的后面加一个我们自定义的迭代器对象名即可 --- 一般都是用 it(迭代器缩写)+ 元素位置来命名
4.给迭代器对象(指针)赋值(赋地址)相当于传给它容器中元素的地址 --- 通过容器自身的方法来获取地址
5.通过解引用迭代器对象我们可以访问到容器中,迭代器对象指向的对应的数据
关于遍历容器中的数据,除了用上面这种自己写的遍历算法之外,我们还可以用STL提供的标准遍历算法,使用方法如下:
1.和使用容器一样,要包含标准算法所属的头文件 ---
包含了头文件之后我们就能够使用头文件中包含的各种标准算法了
for_each就是标准算法头文件中包含的标准遍历算法,我们要传的参数有三个
第一个是我们要遍历的容器中的数据起点,第二个是我们要遍历的容器中的数据终点,第三个是一个函数名,我们会将每一次遍历得到的数据作为参数传给这个函数,并且这个函数每遍历一次就会调用一次
通过迭代器对象调用其指向的容器中的自定义类型对象的成员有两种方式:
1.解引用后得到对象本身然后用点操作符访问
2.由于是指针,且获取的是对象的地址,所以可以直接用指针加箭头操作符的方式访问对象的成员
(获取到指向对象的指针之后,我们可以通过指针+箭头操作符的方式访问对象的成员)
(push_back()方法就是vector容器中的尾插法(在容器中的最后一个元素的后面插入一个元素))
一个Vector容器被我们当成一个数组,在一个容器中嵌套别的容器就相当于在数组中嵌套数组 --- 没错,就是二维数组,我们也可以理解为二维容器。
上面这行代码翻译过来就是创建一个容器,这个容器中的元素是根据容器的模板参数类型创建的新的容器
先创建一个大容器,然后大容器的模板参数类型是一个容器类型,通过这个模板参数类型再在大容器中创建一个个小容器+