面试题答案
一键面试返回类型
std::vector
:begin()
返回的迭代器类型是RandomAccessIterator
,它支持随机访问,能像指针一样进行算术运算,如it + n
。std::list
:begin()
返回的迭代器类型是BidirectionalIterator
,它支持双向遍历,即可以通过++
和--
操作向前或向后移动,但不支持随机访问。std::deque
:begin()
返回的迭代器类型也是RandomAccessIterator
,同样支持随机访问。
性能特点
std::vector
:- 遍历性能:由于支持随机访问,对于按顺序遍历操作,在缓存局部性方面表现出色,遍历速度较快。因为数据在内存中是连续存储的,CPU缓存能更有效地预取数据。
- 适用场景:适用于需要频繁随机访问元素,并且插入和删除操作主要在容器末尾进行的场景,例如实现动态数组。
std::list
:- 遍历性能:双向迭代器使得遍历只能逐个移动,不具备随机访问能力,遍历速度相对较慢,尤其是在需要跳跃式访问元素时。但在频繁插入和删除操作后,遍历性能不受影响,因为它不需要移动其他元素。
- 适用场景:适用于需要频繁在容器任意位置进行插入和删除操作的场景,例如实现链表结构,如用于实现一些图算法中的邻接表。
std::deque
:- 遍历性能:虽然支持随机访问,但由于其内存结构并非完全连续(由多个连续内存块组成),在缓存局部性上略逊于
std::vector
,遍历性能稍慢于std::vector
,但比std::list
快。 - 适用场景:适用于需要频繁在容器两端进行插入和删除操作,同时又需要一定随机访问能力的场景,例如实现双端队列。
- 遍历性能:虽然支持随机访问,但由于其内存结构并非完全连续(由多个连续内存块组成),在缓存局部性上略逊于