std::list 是 C++ 标准模板库(STL)中的一个序列容器,它实现了双向链表(Doubly-Linked List)。
与 std::vector 的连续存储不同,std::list 中的元素在内存中是分散的,通过指针相互连接。这种结构决定了它的独特性能特征。
双向链表:
- 每个元素(节点)包含数据、一个指向前一个节点的指针和一个指向后一个节点的指针。
- 支持双向遍历。
非连续存储:
- 元素在内存中不连续,这与 std::vector 形成鲜明对比。
- 无法使用指针算术或像数组一样访问。
高效的任意位置插入/删除:
- 在已知位置(通过迭代器)插入或删除元素的时间复杂度为 O(1)。
- 这是 std::list 最大的优势,无论是在头部、中间还是尾部。
低效的随机访问:
- 由于元素不连续,访问第 n 个元素需要从头或尾开始遍历,时间复杂度为 O(n)。
- 不支持 operator[] 或 at()。
动态大小与无容量限制:
- 大小可以动态增长或缩小。
- 没有“容量(capacity)”的概念,每次插入都分配新节点,删除则释放节点。
稳定的迭代器:
- 这是 std::list 的另一个巨大优势。
- 插入操作不会使任何迭代器失效。
- 只有被删除元素的迭代器会失效,其他所有迭代器、指针和引用都保持有效。