华为OD面试真题题库
专栏:华为OD面试真题题库
目录: 最新华为OD面试手撕代码真题目录以及八股文真题目录
STL有哪些容器
1. 序列容器
这些容器在内部按顺序存储元素。
vector
:提供动态数组功能,可以随机访问元素。优点是访问速度快,尾部添加/删除元素效率高;缺点是中间插入或删除元素效率低。deque
:双端队列,支持在头部和尾部高效地插入和删除元素。相比vector
,deque
在头部插入和删除效率更高。list
:双向链表,支持在任何位置高效地插入和删除元素。优点是插入和删除效率高;缺点是不支持随机访问,访问元素效率较低。forward_list
(C++11新增):单向链表,比list
更节省空间,但只能向前遍历。
2. 关联容器
这些容器内部使用树结构(通常是红黑树),元素根据键进行排序。
set
:集合,存储唯一键的集合,自动排序。map
:映射,存储键值对,根据键排序,键是唯一的。multiset
:多重集合,可以存储重复的键。multimap
:多重映射,可以存储重复键的键值对。
3. 无序关联容器(C++11新增)
基于哈希表实现,元素不排序,提供平均常数时间的复杂度进行查找、插入和删除操作。
unordered_set
:无序集合,存储唯一键的集合。unordered_map
:无序映射,存储键值对,键是唯一的。unordered_multiset
:无序多重集合,可以存储重复的键。unordered_multimap
:无序多重映射,可以存储重复键的键值对。
4. 容器适配器
容器适配器提供了一种方式,以修改现有容器类的接口。
stack
:栈适配器,默认使用deque
实现。后进先出(LIFO)数据结构。queue
:队列适配器,默认使用deque
实现。先进先出(FIFO)数据结构。priority_queue
:优先队列适配器,默认使用vector
实现,但元素按优先级排序。
Vector和list的区别是什么
1. 数据结构
vector
:基于动态数组的实现。它在内存中连续存储所有元素,这意味着可以通过指针算术直接计算元素位置,从而实现快速的随机访问。list
:基于双向链表的实现。每个元素都作为一个节点独立存储,每个节点通过指针连接前一个和后一个节点。这种结构使得在任何位置插入和删除操作都非常高效,但不支持直接的随机访问。
2. 性能特点
-
访问元素:
vector
:提供非常高效的随机访问能力,访问任意位置的元素的时间复杂度为O(1)。list
:只能通过顺序访问来找到特定元素,访问任意位置的元素的时间复杂度为O(n)。
-
插入和删除操作:
vector
:- 在尾部插入和删除操作非常高效(通常为O(1)),但可能涉及到动态数组的重新分配和元素的复制或移动。
- 在中间或开始插入和删除效率较低,因为可能需要移动多个元素。
list
:- 在任何位置插入和删除元素都非常高效,时间复杂度为O(1),因为这仅仅涉及修改指针而不需要移动其他元素。
3. 内存使用
vector
:由于内部使用数组,所以内存使用相对紧凑,但在扩容时可能会有额外的内存开销。list
:每个元素需要额外的内存来存储指向前后节点的指针,因此内存使用比vector
更高。
4. 应用场景
vector
:适合那些需要快速随机访问元素的场景,或者添加和删除操作主要发生在序列的末尾。list
:适合那些需要频繁插入和删除操作的场景,尤其是在序列的中间或开始位置进行这些操作。