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

星辰同学_1874

星辰同学_1874

2026-01-30

397人浏览

原创

std::list 声明需指定元素类型,不支持下标访问;常用初始化有空构造、初始化列表、拷贝及迭代器区间构造;push_front/push_back为O(1)头尾插入,insert需迭代器位置且返回新元素迭代器;遍历必须用迭代器或范围for,因链表内存不连续,无operator[]。

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

怎么声明和初始化一个 std::list

直接用 std::list 模板,指定元素类型即可。它不支持随机访问,所以别指望用下标 [] 取值。

常见初始化方式:

  • std::list lst; —— 空链表
  • std::list lst = {1, 2, 3}; —— C++11 初始化列表(最常用)
  • std::list lst(other_lst); —— 拷贝构造
  • std::list lst(other_lst.begin(), other_lst.end()); —— 迭代器区间构造

注意:不能像 vector 那样用 list(10, 5) 构造 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 更适合频繁中间操作的原因)。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

遍历和查找为什么不能用下标,而要用迭代器

std::list 是双向链表,内存不连续,operator[] 和 at() 根本不存在。强行写 lst[5] 会编译失败,错误信息类似:error: no match for 'operator[]'。

正确遍历方式只有迭代器(或范围 for):

std::find(lst.begin(), lst.end(), 42)
  • 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++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1029

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3260

5

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

7019

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3365

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4388

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2965

10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

6596

4

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习