1. STL与list容器概述
在C++标准模板库(STL)中,list是最经典的序列式容器之一。与vector不同,list采用双向链表结构实现,这使得它在任意位置插入和删除元素时都能保持O(1)的时间复杂度。我在实际项目中发现,当需要频繁在序列中间进行操作时,list的性能优势尤为明显。
list的核心特性包括:
- 双向链表结构:每个节点包含数据域和前后指针
- 非连续内存:节点通过指针链接,内存利用率略低但操作灵活
- 迭代器稳定性:增删元素不会使其他元素的迭代器失效(vector在扩容时会失效)
注意:虽然list的插入删除高效,但随机访问需要O(n)时间,这与vector的O(1)随机访问形成鲜明对比。选择容器时要根据实际场景权衡。
2. list的核心接口解析
2.1 基础操作接口
list提供了一套完整的容器接口,以下是几个最常用的成员函数:
cpp复制// 构造与初始化
list<int> lst1; // 空list
list<int> lst2(5, 100); // 5个100
list<int> lst3(lst2.begin(), lst2.end()); // 范围构造
// 元素访问
int front = lst2.front(); // 首元素
int back = lst2.back(); // 末元素
// 容量查询
bool empty = lst1.empty();
size_t size = lst2.size();
在实际编码中,我习惯先用empty()判断非空再访问元素,这比直接调用front()/back()更安全。
2.2 关键修改操作
list最强大的能力体现在元素修改上:
cpp复制// 插入操作
lst1.push_front(10); // 头插
lst1.push_back(20); // 尾插
auto it = lst1.begin();
advance(it, 1);
lst1.insert(it, 15); // 在指定位置插入
// 删除操作
lst1.pop_front(); // 头删
lst1.pop_back(); // 尾删
lst1.erase(it); //
