1. List容器基础认知
作为C++标准模板库(STL)中最经典的序列式容器之一,list本质上是一个带头结点的双向循环链表。与vector的连续线性空间不同,list的存储特性决定了它在任意位置插入删除都是常数时间复杂度,但随机访问的效率是O(n)。这种差异就像数组和链表的区别——vector像整齐排列的书架,而list更像是用绳子串起来的记事本。
在实际工程中,list特别适合以下场景:
- 需要频繁在序列中间进行插入删除操作(如游戏中的单位对象管理)
- 元素体积较大导致vector扩容成本过高时(如存储多媒体数据块)
- 需要实现特殊数据结构如LRU缓存(利用O(1)时间复杂度的插入删除)
标准库中的list定义在头文件中,其类模板声明如下:
cpp复制template <class T, class Alloc = allocator<T>>
class list;
其中Alloc参数默认为allocator,这也是STL容器的一贯设计风格。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 标准库List核心接口解析
2.1 构造与初始化
list提供多种构造方式,最常用的包括:
cpp复制list<int> l1; // 空list
list<int> l2(10); // 10个默认构造的元素
list<int> l3(5, 100); // 5个值为100的元素
list<int> l4(l3.begin(), l3.end()); // 迭代器范围构造
注意:使用迭代器范围构造时,传入的迭代器可以是任意容器的迭代器,只要元素类型兼容。这种设计体现了STL的泛型编程思想。
2.2 关键操作接口
- 元素访问:front()/back()获取首尾元素(不提供随机访问操作符[])
- 容量查询:empty()/size()(注意size()在C++11前可能是O(n)复杂度)
- 修改操作:
cpp复制push_front(val); // 头插 pop_front(); // 头删 push_back(val); // 尾插 pop_back(); // 尾删 insert(pos_iter, val); // 在pos_
