list

  1. list的定义和结构
1)list的定义
  • 模板定义: template <class T, class Allocator = std::allocator> class list;
  • 使用频率: 在算法题中极少使用,通常用数组模拟链表或手写链表替代
  • 底层结构: 双向链表,以节点(node)形式存储元素,通过指针链接形成链表结构
  • 内存特性: 节点在内存中不连续存储,每个节点包含元素值和前后指针
  • std::list mylist; mylist.push_back(1); mylist.push_front(1);
2)list的特点
  • 双向性: 每个节点包含指向前后节点的指针,支持

    O(1)

    时间复杂度的任意位置插入/删除

  • 动态大小: 可动态扩展/收缩,无需预先指定容器大小

  • 访问特性:

    • 优点:插入删除效率高(

      O(1)

    • 缺点:随机访问效率低(O(n)),必须通过遍历访问

  • 与vector对比:

    • vector适合频繁随机访问
    • list适合频繁插入删除
    • vector内存连续,list内存不连续
3)应用案例
2. list的常用函数

![[Pasted image 20260407211324.png]]

1)front
  • 功能: 返回首元素引用
  • 特性: 可直接修改元素值myList.front() = x;
  • 对比back: back()返回尾元素引用
2)begin与end
  • 迭代器操作: 仅支持++/--逐步移动,不支持随机访问 ++ ++ begin()
  • 特殊注意:
    • begin()返回首元素迭代器
    • end()返回末尾的下一个位置
    • 与vector迭代器语法相似但底层实现不同
3)insert
  • 插入位置: 在指定迭代器位置前插入

  • 示例: insert(++myList.begin(), 0)在第二个位置插入0

  • 时间复杂度:

    O(1)

4)erase
  • 删除方式:
    • 单元素删除:erase(pos)
    • 区间删除:erase(first, last)(左闭右开)
  • 注意事项: 需确保迭代器有效性,避免操作空链表
3. 代码示例
  • 初始化: 创建包含1-5的list
  • 反转操作: reverse(myList.begin(), myList.end())变为5→4→3→2→1
  • 插入操作: 在第二个位置插入0后为5→0→4→3→2→1
  • 删除操作: erase(++++myList.begin(), --myList.end())删除第3到倒数第2个元素,最终为5→0→1
  • 重要提醒:
    • size()返回unsigned int类型,做减法时需类型转换 (int)size-1
    • 所有操作需保证链表非空
    • 迭代器失效规则与vector不同
posted @ 2026-04-08 13:17  Sherry_pro  阅读(4)  评论(0)    收藏  举报