【八股】基于STL实现的笔试题常考七大基本数据结构
上篇文章 详细介绍了九大数据结构,了解后可以与面试官侃侃而谈了。但是没有与常见题目和具体实现结合,如果面试官要求你手动实现,也需要至少会写出最常见的几种。作为C++选手,我在刷题过程中总结了常考的数据结构的特点,并结合最近阅读的《C++ Primer》、《代码随想录》,介绍了用STL模板库(一般指 SGI STL版本)具体实现的注意事项。本文可以作为准备面试的材料。
下面文章是在《代码随想录》和《labuladong的算法笔记》题目中的具体实践:
【笔记】数组
【笔记】链表
【笔记】哈希表
【笔记】字符串
【笔记】栈与队列
【笔记】二叉树
0、STL 容器总结
六大顺序容器
容器名称 | 特点说明 |
---|---|
vector | 可变大小数组。支持快速随机访问。在尾部之外的位置插入、删除元素可能很慢。 |
deque | 双端队列。支持快速随机访问。在头、尾位置插入、删除元素速度很快。 |
list | 双向链表。只支持双向顺序访问。在list中任何位置插入、删除操作速度都很快。size时间复杂度O(n)。 |
forward_list | 单向链表。只支持单向顺序访问。在forward_list中任何位置插入、删除操作速度都很快。没有size操作。 |
array | 固定大小数组。支持快速随机访问。不能添加、删除元素。 |
string | 与vector相似,但只保存字符。支持快速随机访问。在尾部位置插入、删除元素速度快。 |
注意:
- 现代C++程序应使用标准库容器
- 两个不同容器赋值,注意灵活使用构造函数。一般参数是首begin、尾end迭代器,而不是用for遍历元素然后插入;两个相同容器赋值,可用初始化语句把另一个容器整个拷贝过来
- vector是最优解,除非有更好的理由使用别的容器
- deque也可以用下标随机访问,但并非连续存储,其元素地址不连续
- 除list外,size的时间复杂度O(1),forward_list没有size操作
- 只有顺序容器(array除外)的构造函数才能接受大小参数
- 当不需要写访问时,迭代器应使用cbegin和cend
- 向一个string,vector和deque插入元素,会使得所有指向容器的迭代器、引用和指针失效
- emplace_back直接在容器的内存空间创建对象,而push_back是先创建临时对象,然后压入容器,前者效率更高一些
三大顺序容器适配器
容器适配器名称 | 说明 |
---|---|
stack | 栈。默认底层容器是deque,也可构造于除array,forward_list的其他容器之上。 |
queue | 队列。默认底层容器是deque,也可构造于list之上。不能用vector,因为不支持删除首元素。 |
priority_queue | 优先级队列。常被用来实现堆。默认底层容器是vector,也可构造于deque之上。不能用list,因为不能随机访问。 |
注意:
- 所有适配器,不能构造于array(不能添加、删除),forward_list(不能直接访问尾元素)之上
- 适配器的功能决定其底层的容器。