C++ STL list 容器详解
一、基本特性
- 双向链表结构
std::list是双向链表的模板类实现,每个节点包含数据域和指向前后节点的指针:struct ListNode { T data; ListNode* prev; ListNode* next; }; - 时间复杂度
- 插入/删除:$O(1)$(已知迭代器位置)
- 随机访问:$O(n)$
- 排序:$O(n \log n)$(成员函数
sort())
二、核心操作
1. 初始化
#include <list>
std::list<int> lst1; // 空链表
std::list<int> lst2(5, 10); // 5个值为10的元素
std::list<int> lst3(lst2.begin(), lst2.end()); // 范围构造
2. 元素操作
lst.push_front(1); // 头部插入
lst.push_back(2); // 尾部插入
lst.insert(itr, 3); // 指定位置插入
lst.pop_front(); // 头部删除
lst.erase(itr); // 删除迭代器指向元素
lst.remove(10); // 删除所有值为10的元素
3. 迭代器
for (auto itr = lst.begin(); itr != lst.end(); ++itr) {
std::cout << *itr << " ";
}
三、模拟实现关键点
1. 节点结构
template <typename T>
struct __list_node {
T data;
__list_node* prev;
__list_node* next;
};
2. 迭代器封装
template <typename T>
struct __list_iterator {
__list_node<T>* ptr;
// 重载运算符
T& operator*() { return ptr->data; }
__list_iterator& operator++() {
ptr = ptr->next;
return *this;
}
};
3. 核心接口实现
template <typename T>
class my_list {
private:
__list_node<T>* __head; // 哨兵节点
public:
void push_back(const T& val) {
__list_node<T>* new_node = new __list_node<T>{val, __head->prev, __head};
__head->prev->next = new_node;
__head->prev = new_node;
}
iterator begin() {
return iterator(__head->next);
}
};
四、典型应用场景
- 频繁插入删除
例如游戏中的动态对象管理:std::list<GameObject> obj_list; obj_list.erase(obj_list.begin()); // 快速移除首元素 - 大元素存储
避免vector扩容时的拷贝开销:std::list<LargeData> data_chain;
五、性能对比
| 操作 | std::vector | std::list |
|---|---|---|
| 随机访问 | $O(1)$ | $O(n)$ |
| 头部插入 | $O(n)$ | $O(1)$ |
| 中间插入 | $O(n)$ | $O(1)$ |
| 局部排序 | 低效 | 高效(splice) |
提示:优先选择
std::list的场景:
- 元素大小超过缓存行(通常 > 64字节)
- 需要高频在任意位置插入/删除
- 需要稳定迭代器(无失效问题)

739

被折叠的 条评论
为什么被折叠?



