C++如何使用std::list?(双向链表操作)

15次阅读

std::list 是双向链表容器,支持 O(1) 插入删除但不支持随机访问;可空初始化、指定元素构造、初始化列表或范围构造;操作均基于迭代器,支持头尾及任意位置增删、条件删除;遍历须用迭代器或范围 for

C++如何使用std::list?(双向链表操作)

std::list 是 c++ 标准库提供的双向链表容器,支持在任意位置高效插入、删除(O(1)),但不支持随机访问(不能用下标 [] 直接取元素)。它适合频繁增删、不常遍历或查找的场景。

初始化与基本操作

创建 list 有多种方式:

  • 空列表std::list lst;
  • 指定初始元素个数和值std::list Chars(5, 'a'); → 包含 5 个 ‘a’
  • 用初始化列表构造std::list nums = {1.1, 2.2, 3.3};
  • 从其他容器范围构造std::list lst(v.begin(), v.end());(v 是 vector)

插入与删除(核心优势)

所有插入/删除操作都基于迭代器,且保证常数时间复杂度:

  • 头部/尾部插入lst.push_front(10); lst.push_back(20);
  • 任意位置插入auto it = lst.begin(); ++it; lst.insert(it, 15);(在第二个位置插 15)
  • 头部/尾部删除lst.pop_front(); lst.pop_back();
  • 删除指定迭代器位置lst.erase(it);
  • 删除满足条件的所有元素lst.remove_if([](int x) { return x % 2 == 0; });

遍历与访问

list 不支持 operator[] 或 at(),必须用迭代器或范围 for:

立即学习C++免费学习笔记(深入)”;

  • 正向遍历for (auto it = lst.begin(); it != lst.end(); ++it) { std::cout
  • 反向遍历for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) { std::cout
  • C++11 范围 forfor (const auto& x : lst) { std::cout
  • 获取首尾元素(不检查空)lst.front(); lst.back();(使用前建议先判空)

常用算法与特殊操作

list 提供了一些专属成员函数,比通用算法更高效:

  • 合并两个有序 listlst1.merge(lst2);(要求两者均已升序排序)
  • 拼接另一个 list 到末尾lst1.splice(lst1.end(), lst2);(lst2 变为空)
  • 按值移除所有匹配项lst.remove(42);
  • 去重(相邻重复才删)lst.unique();(需先 sort)
  • 排序(稳定排序)lst.sort(); 或传自定义比较器:lst.sort(std::greater());

注意:list 的迭代器是双向的(BidirectionalIterator),不能像 vector 那样做算术运算(如 it + 3),所有移动必须用 ++/–。

text=ZqhQzanResources