一、讲讲STL的六大组件
1、容器:存放数据的各种数据结构
2、迭代器:为了访问容器中的元素,是一种泛型指针
3、算法:可以操作容器中的元素,如 sort、search、copy
4、适配器:容器适配器(stack、queue)、算法适配器(mem_fn)、迭代器适配器(插入迭代器)
5、函数对象(仿函数):重载()创建的对象。
6、空间适配器:负责空间的申请与释放
二、vector 及其底层原理
vector 是封装了动态大小数组的顺序容器,它能够存放各种类型的对象,可以简单的认为,vector是一个能够存放任意类型的动态数组
vector采用线性连续空间,以两个迭代器 start 和 finish 分别指向配置得来的连续空间中目前已被使用的空间 ,迭代器 end_of_storage 指向整块连续空间(含备用空间)的尾端。
vector在调⽤ push_back 插⼊新元素的时候,⾸先会检查是否有备⽤空间,如果有就直接在备⽤空间上构造元素,并调整迭代器 finish ,如果超过自身最大的容量,vector 则将自身的容量扩充为原来的两倍 (重新配置空间、元素移动、释放旧的空间)
内存扩充操作:如果原空间⼤⼩为 0 则分配 1 个元素,如果⼤于 0 则分配原空间两倍的新空间,然后把数据拷⻉过去
三、vector迭代器失效问题
迭代器底层就是一个指针,迭代器失效就是指迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃
造成迭代器失效的操作:resize、insert、erase、push_back 等会引起底层空间改变的操作
四、push_back 和 emplace_back 的区别
push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。