c++ list容器怎么用 c++双向链表list操作【详解】

发布时间 - 2025-12-26 00:00:00    点击率:
std::list是双向链表,支持O(1)任意位置增删但不支持随机访问;初始化方式多样,操作依赖迭代器,提供splice、merge、sort等高效特有方法。

C++ 的 std::list 是标准库提供的双向链表容器,底层不连续存储,支持高效地在任意位置插入、删除(O(1)),但不支持随机访问(不能用下标 []at() 直接取第 n 个元素)。

初始化和基本操作

创建 list 有多种方式:

  • std::list lst; —— 空链表
  • std::list lst = {1, 2, 3, 4}; —— 初始化列表构造(C++11 起)
  • std::list lst(5, 10); —— 创建含 5 个值为 10 的元素
  • std::list lst2(lst1); —— 拷贝构造

常用增删改查方法

所有操作都基于迭代器,没有下标访问:

  • lst.push_front(x) —— 头插
  • lst.push_back(x) —— 尾插
  • lst.insert(it, x) —— 在迭代器 it 指向位置前插入(返回新元素迭代器)
  • lst.erase(it) —— 删除 it 指向的单个元素(返回后继迭代器)
  • lst.erase(first, last) —— 删除 [first, last) 区间
  • lst.pop_front() / lst.pop_back() —— 删除首/尾元素(不返回值)
  • lst.front() / lst.back() —— 获取首/尾元素引用(容器非空时才安全)

遍历与查找

只能用迭代器或范围 for 循环:

  • 传统迭代器遍历:
    for (auto it = lst.begin(); it != lst.end(); ++it) { cout
  • 范围 for(推荐):
    for (const auto& x : lst) { cout
  • 查找需手动循环或用 std::find
    auto it = std::find(lst.begin(), lst.end(), 5); —— 返回第一个值为 5 的迭代器,未找到则为 end()

特殊操作与注意事项

list 提供了一些普通序列容器没有的高效操作:

  • lst.splice(pos, other_lst) —— 把 other_lst 全部“剪切粘贴”到 pos 前(O(1),不复制元素)
  • lst.splice(pos, other_lst, it) —— 移动 other_lstit 指向的单个节点
  • lst.merge(other_lst) —— 合并两个已排序的 list(会清空 other_lst
  • lst.sort() —— 对本 list 排序(比 std::sort 更高效,因是链表)
  • lst.remove(x) —— 删除所有等于 x 的元素
  • lst.remove_if(pred) —— 删除满足谓词 pred 的元素
  • 注意:插入/删除后,除被操作位置外,其他迭代器通常仍有效(这是 list 的优势)

不复杂但容易忽略:list 的 size() 在 C++11 前是 O(n),C++11 起保证是 O(1);频繁按位置访问(如要第 5 个元素)应考虑换用 vector 或 deque。


# c++  # 标准库  # red  # sort  # for  # const  # auto  # int  # 循环  # 迭代  # 链表  # 遍历  # 但不  # 值为  # 这是  # 第一个  # 不能用  # 只能用  # 时才 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何用西部建站助手快速创建专业网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何在宝塔面板创建新站点?  EditPlus中的正则表达式 实战(1)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Swift中swift中的switch 语句  Java类加载基本过程详细介绍  用yum安装MySQLdb模块的步骤方法  PHP正则匹配日期和时间(时间戳转换)的实例代码  EditPlus中的正则表达式 实战(4)  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  linux写shell需要注意的问题(必看)  JavaScript模板引擎Template.js使用详解  详解Android中Activity的四大启动模式实验简述  网站制作价目表怎么做,珍爱网婚介费用多少?  如何用PHP工具快速搭建高效网站?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何升级到最新版本?(升级指南和步骤)  Python文件异常处理策略_健壮性说明【指导】  如何在服务器上配置二级域名建站?  html5的keygen标签为什么废弃_替代方案说明【解答】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  智能起名网站制作软件有哪些,制作logo的软件?  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何快速查询网址的建站时间与历史轨迹?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在香港免费服务器上快速搭建网站?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何用搬瓦工VPS快速搭建个人网站?  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  Laravel如何实现多对多模型关联?(Eloquent教程)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Laravel怎么使用artisan命令缓存配置和视图  如何在万网自助建站平台快速创建网站?  javascript读取文本节点方法小结  北京企业网站设计制作公司,北京铁路集团官方网站?  网站制作免费,什么网站能看正片电影?