面试题答案
一键面试- 原因:
vector
在内存中是连续存储的。当在头部插入元素时,需要将原有的所有元素向后移动一个位置,为新元素腾出空间。如果vector
中元素数量较多,每次在头部插入操作的时间复杂度为(O(n)),(n)为vector
中元素的个数。频繁在头部插入操作,会导致大量的元素移动,从而性能下降。
- 优化方法及适用场景:
- 使用
list
:- 适用场景:当需要频繁在容器头部或中部插入、删除元素,且对随机访问没有需求时适用。
list
是双向链表结构,插入和删除操作时间复杂度为(O(1)),不需要移动大量元素。例如实现一个简单的队列或栈结构,元素的进出操作频繁,且不关心随机访问元素时,可以使用list
。
- 适用场景:当需要频繁在容器头部或中部插入、删除元素,且对随机访问没有需求时适用。
- 使用
deque
:- 适用场景:当需要频繁在头部或尾部插入元素,并且偶尔也需要随机访问元素时适用。
deque
(双端队列)允许在两端高效地插入和删除元素,时间复杂度为(O(1)),同时也支持随机访问(虽然效率略低于vector
)。例如实现一个循环缓冲区,需要在两端频繁操作元素,同时可能会随机访问其中元素时,可以使用deque
。
- 适用场景:当需要频繁在头部或尾部插入元素,并且偶尔也需要随机访问元素时适用。
- 批量插入:
- 适用场景:当有多个元素需要插入时适用。例如一次性有(m)个元素要插入
vector
,如果一个一个插入,每次插入都要移动元素,时间复杂度为(O(m * n))((n)为vector
原有的元素个数)。而使用vector
的insert
函数批量插入(如vec.insert(vec.begin(), first, last)
,first
和last
是要插入元素范围的迭代器),只需要移动一次元素,时间复杂度降为(O(n + m))。比如在从文件或数据库中读取一批数据插入到vector
时,适合批量插入。
- 适用场景:当有多个元素需要插入时适用。例如一次性有(m)个元素要插入
- 使用