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

std::list 是 c++ 标准库提供的双向链表容器,支持在任意位置高效插入、删除(O(1)),但不支持随机访问(不能用下标 [] 直接取元素)。它适合频繁增删、不常遍历或查找的场景。
初始化与基本操作
创建 list 有多种方式:
- 空列表:
std::listlst; - 指定初始元素个数和值:
std::list→ 包含 5 个 ‘a’Chars(5, 'a'); - 用初始化列表构造:
std::listnums = {1.1, 2.2, 3.3}; - 从其他容器范围构造:
std::list(v 是 vector)lst(v.begin(), v.end());
插入与删除(核心优势)
所有插入/删除操作都基于迭代器,且保证常数时间复杂度:
- 头部/尾部插入:
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 范围 for:
for (const auto& x : lst) { std::cout - 获取首尾元素(不检查空):
lst.front(); lst.back();(使用前建议先判空)
常用算法与特殊操作
list 提供了一些专属成员函数,比通用算法更高效:
- 合并两个有序 list:
lst1.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),所有移动必须用 ++/–。