STL面试题

发布时间 2023-04-03 23:55:44作者: 晚安地球人1

一、讲讲STL的六大组件

1、容器:存放数据的各种数据结构

2、迭代器:为了访问容器中的元素,是一种泛型指针

3、算法:可以操作容器中的元素,如 sort、search、copy

4、适配器:容器适配器(stack、queue)、算法适配器(mem_fn)、迭代器适配器(插入迭代器)

5、函数对象(仿函数):重载()创建的对象。

6、空间适配器:负责空间的申请与释放

二、vector 及其底层原理

vector 是封装了动态大小数组的顺序容器,它能够存放各种类型的对象,可以简单的认为,vector是一个能够存放任意类型的动态数组

vector采用线性连续空间,以两个迭代器 startfinish 分别指向配置得来的连续空间中目前已被使用的空间 ,迭代器 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() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。