C++ list怎么用 C++双向链表容器常用操作详解【STL】
发布时间 - 2026-01-30 00:00:00 点击率:次std::list 声明需指定元素类型,不支持下标访问;常用初始化有空构造、初始化列表、拷贝及迭代器区间构造;push_front/push_back为O(1)头尾插入,insert需迭代器位置且返回新元素迭代器;遍历必须用迭代器或范围for,因链表内存不连续,无operator[]。
怎么声明和初始化一个 std::list
直接用 std::list 模板,指定元素类型即可。它不支持随机访问,所以别指望用下标 [] 取值。
常见初始化方式:
-
std::list—— 空链表lst; -
std::list—— C++11 初始化列表(最常用)lst = {1, 2, 3}; -
std::list—— 拷贝构造lst(other_lst); -
std::list—— 迭代器区间构造lst(other_lst.begin(), other_lst.end());
注意:不能像 vector 那样用 list 构造 10 个 5,list 的构造函数不支持这种“数量+值”重载(C++11 起才加入,但很多旧项目或编译器仍不默认启用,容易误报错)。
push_front、push_back 和 insert 怎么选
push_front 和 push_back 是 O(1) 插入,适合在头尾追加;insert 必须传迭代器位置,且只能插入到该位置之前(不是“替换”)。
关键细节:
-
lst.insert(lst.begin(), 42)等价于lst.push_front(42) -
lst.insert(lst.end(), 42)等价于lst.push_back(42) - 若想在第 3 个位置插入(即索引为 2),得先用
std::next(lst.begin(), 2)获取迭代器——list不支持lst[2] -
insert返回新插入元素的迭代器,可用于连续插入:auto it = lst.insert(pos, 1); lst.insert(it, 2);
别对失效迭代器调用 insert:list 的插入/删除只使**对应迭代器**失效,其他迭代器仍有效(这是它比 vector 更适合频繁中间操作的原因

遍历和查找为什么不能用下标,而要用迭代器
std::list 是双向链表,内存不连续,operator[] 和 at() 根本不存在。强行写 lst[5] 会编译失败,错误信息类似:error: no match for 'operator[]'。
正确遍历方式只有迭代器(或范围 for):
for (auto it = lst.begin(); it != lst.end(); ++it) {
std::cout << *it << " ";
}
// 或更简洁:
for (const auto& x : lst) {
std::cout << x << " ";
}
查找必须配合算法:std::find(lst.begin(), lst.end(), 42)。别手写循环找——虽然可行,但语义不清,且容易忽略 end() 判断。
性能提醒:std::find 是 O(n),没有“哈希加速”,如果需要高频查找,list 本身就不合适,应换 unordered_set 或加索引结构。
删除元素时 erase 和 remove 有什么区别
erase 删除**迭代器指向的单个节点**(或迭代器区间),返回下一个有效迭代器;remove 是成员函数,删除**所有等于某值的节点**(不返回迭代器,也不保证顺序,但保持剩余元素相对顺序)。
典型误用:
-
lst.erase(5)❌ 编译失败 ——erase不接受值,只接受迭代器 -
lst.remove_if([](int x) { return x > 10; })✅ 正确,删掉所有大于 10 的元素 - 循环中删除要小心:
for (auto it = lst.begin(); it != lst.end(); ) { if (*it == 0) it = lst.erase(it); else ++it; }—— 必须用erase返回值更新it,否则迭代器失效后继续++it是未定义行为
还有一个易忽略点:remove 不改变容器大小?错。它确实删除节点、调用析构、减小 size(),但它不释放内存(list 的节点分配是离散的,没“capacity”概念,所以无所谓释放)。
真正复杂的是带条件的批量删除和迭代器稳定性——只要不用错 erase 返回值,就基本不会崩;但一旦混用 remove 和手动 erase,逻辑容易绕晕。
# c++
# 为什么
# if
# for
# 成员函数
# 构造函数
# Error
# auto
# int
# 循环
# operator
# 算法
# 迭代
# 遍历
# 不支持
# 链表
# 它不
# 返回值
# 的是
# 这是
# 不连续
# 也不
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建高效服务器建站系统?
如何在阿里云香港服务器快速搭建网站?
如何在万网利用已有域名快速建站?
Android okhttputils现在进度显示实例代码
Laravel如何实现API资源集合?(Resource Collection教程)
python中快速进行多个字符替换的方法小结
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel Session怎么存储_Laravel Session驱动配置详解
详解Android中Activity的四大启动模式实验简述
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
jQuery validate插件功能与用法详解
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
做企业网站制作流程,企业网站制作基本流程有哪些?
如何打造高效商业网站?建站目的决定转化率
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何处理文件下载请求?(Response示例)
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Bootstrap整体框架之JavaScript插件架构
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
如何用已有域名快速搭建网站?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
活动邀请函制作网站有哪些,活动邀请函文案?
Android 常见的图片加载框架详细介绍
轻松掌握MySQL函数中的last_insert_id()
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
无锡营销型网站制作公司,无锡网选车牌流程?
php 三元运算符实例详细介绍
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
如何在Windows服务器上快速搭建网站?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
深入理解Android中的xmlns:tools属性
浅谈Javascript中的Label语句
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
php json中文编码为null的解决办法
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
北京网站制作公司哪家好一点,北京租房网站有哪些?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
JS中对数组元素进行增删改移的方法总结
如何用AI帮你把自己的生活经历写成一个有趣的故事?
浅谈javascript alert和confirm的美化
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
如何在腾讯云服务器快速搭建个人网站?

