为什么list没有push_front()函数?
参考回答
实际上,std::list
是支持 push_front()
函数的。它是 C++ 标准模板库 (STL) 中 std::list
的成员函数,用于在链表的头部插入一个元素。
示例代码:
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> lst = {2, 3, 4};
lst.push_front(1); // 在头部插入元素1
for (int val : lst) {
cout << val << " ";
}
return 0;
}
输出:
1 2 3 4
详细讲解与拓展
1. 为什么 list
支持 push_front()
?
std::list
是通过 双向链表 实现的,因此在头部插入元素非常高效,时间复杂度为 (O(1))。链表的节点存储了两个指针(分别指向前一个和后一个节点),在头部插入时只需调整前后指针即可。
示意图:
– 初始链表:NULL <- 2 <-> 3 <-> 4 -> NULL
– 执行 push_front(1)
后:
NULL <- 1 <-> 2 <-> 3 <-> 4 -> NULL
2. 与其他容器的对比
std::deque
:- 也支持
push_front()
,但它是通过分段连续数组实现的。 - 适合高效的头部和尾部插入。
- 也支持
std::vector
:- 不支持
push_front()
,因为它是动态数组,头部插入需要移动所有元素,时间复杂度为 (O(n)),效率低下。
- 不支持
3. 常见用法
push_front()
常用于需要在链表头部高效插入元素的场景。例如:
– 构建一个逆序链表。
– 在处理优先级队列时,按优先级插入到头部。
示例代码:
#include <list>
#include <iostream>
using namespace std;
int main() {
list<int> lst;
lst.push_front(10);
lst.push_front(20); // 插入到头部
lst.push_front(30);
for (int val : lst) {
cout << val << " ";
}
return 0;
}
输出:
30 20 10
总结
std::list
是支持 push_front()
的,因为双向链表的设计使其能够高效地在头部插入元素。这个函数常用于需要快速向头部添加元素的场景,如逆序构建链表或处理特殊优先级队列。与 std::vector
和 std::deque
不同,list
在头部插入的效率更高,时间复杂度为 (O(1))。