C++必学系列:STL中的list容器

目录

  • 一、底层:双向链表
  • 二、特性:优势和局限
    • 1. 核心优势
    • 2. 局限性
  • 三、操作:基础运用
    • 1. 初始化与赋值
    • 2. 插入与删除
    • 3. 遍历与访问
    • 4. 其他常用接口
  • 四、适用场景
    • 1. 优先使用list的场景
    • 2. 优先使用其他容器的场景
  • 五、注意事项
    • 1. 迭代器失效
    • 2. 排序与算法适配
    • 3. 遍历效率优化
  • 六、总结

前言:
在C++ STL的容器家族中,list是一款基于双向链表实现的序列式容器,今天通过本文带大家全面认识STL list,助力在实际开发中精准选型、高效使用。

一、底层:双向链表

STL list的底层是双向循环链表,每个节点(node)包含三个核心部分:

  • 数据域:存储实际的数据元素(T value);

  • 前驱指针:指向当前节点的前一个节点(prev);

  • 后继指针:指向当前节点的后一个节点(next)。

与vector的动态数组不同,list的节点在内存中非连续存储,节点间通过指针关联形成链表结构。
这种设计带来了两个关键特性:

  • 插入、删除操作无需移动大量元素,仅需调整指针指向;
  • 无法支持随机访问,访问元素必须从链表头部或尾部开始遍历。

此外,STL list通常会维护一个“哨兵节点”,用于简化链表的空状态处理和首尾操作逻辑。哨兵节点不存储有效数据,其prev指向链表尾节点,next指向链表头节点,使整个链表形成闭环,避免了对空指针的频繁判断。

二、特性:优势和局限

1. 核心优势

  • 高效的插入/删除操作:在链表任意位置插入或删除元素,时间复杂度为O(1)。仅需修改目标节点前后节点的指针,无需移动其他元素,这是list最突出的优势。

  • 稳定的迭代器特性:插入、删除操作不会导致除被删除节点外的其他迭代器失效。因为迭代器本质是指向节点的指针,只要节点未被删除,其地址不变,迭代器就依然有效。

  • 灵活的内存管理:节点按需分配和释放内存,无需预先分配连续空间,适合存储大量动态增减的元素,避免了vector扩容时的内存浪费和拷贝开销。

  • 双向遍历支持:支持从头部(begin())和尾部(rbegin())双向遍历,满足复杂场景下的遍历需求。

2. 局限性

  • 不支持随机访问:无法通过下标([])或at()方法直接访问指定位置元素,访问第n个元素必须从首尾遍历,时间复杂度为O(n),效率远低于vector。

  • 额外的空间开销:每个元素除了存储数据,还需额外存储两个指针(prev和next),对于存储小型数据(如int、char)的场景,空间利用率低于连续存储容器。

  • 缓存命中率低:由于节点在内存中分散存储,无法充分利用CPU缓存的局部性原理,遍历效率低于连续内存的容器。

三、操作:基础运用

1. 初始化与赋值

#include<list>#include<iostream>usingnamespacestd;intmain(){// 1. 空构造list<int>lst1;// 2. 构造n个值为val的元素list<int>lst2(5,10);// [10,10,10,10,10]// 3. 迭代器范围构造vector<int>vec={1,2,3,4};list<int>lst3(vec.begin(),vec.end());// [1,2,3,4]// 4. 拷贝构造list<int>lst4(lst3);// [1,2,3,4]// 5. 赋值操作list<int>lst5;lst5=lst4;// [1,2,3,4]return0;}

2. 插入与删除

list提供了丰富的插入和删除接口,覆盖头部、尾部、任意位置的操作:

list<int>lst={1,2,3,4};autoit=lst.begin();advance(it,2);// 移动迭代器到第3个元素(值为3)// 插入操作lst.push_front(0);// 头部插入:[0,1,2,3,4]lst.push_back(5);// 尾部插入:[0,1,2,3,4,5]lst.insert(it,9);// 迭代器位置插入:[0,1,2,9,3,4,5]// 删除操作lst.pop_front();// 头部删除:[1,2,9,3,4,5]lst.pop_back();// 尾部删除:[1,2,9,3,4]lst.erase(it);// 迭代器位置删除(此时it指向3):[1,2,9,4]// 批量删除lst.remove(2);// 删除所有值为2的元素:[1,9,4]lst.clear();// 清空链表,size变为0

注意:erase(it)会返回指向被删除节点下一个节点的迭代器,避免迭代器失效;而remove(val)会遍历整个链表,删除所有匹配值的节点,时间复杂度为O(n)。

3. 遍历与访问

由于不支持随机访问,list的遍历主要依赖迭代器或范围for循环:

list<int>lst={1,2,3,4,5};// 1. 正向迭代器遍历for(autoit=lst.begin();it!=lst.end();++it){cout<<*it<<" ";// 输出:1 2 3 4 5}// 2. 反向迭代器遍历for(autoit=lst.rbegin();it!=lst.rend();++it){cout<<*it<<" ";// 输出:5 4 3 2 1}// 3. 范围for循环(C++11及以上)for(intval:lst){cout<<val<<" ";// 输出:1 2 3 4 5}// 4. 访问首尾元素(无at()和[]方法)cout<<lst.front();// 1cout<<lst.back();// 5

4. 其他常用接口

  • size():返回当前元素个数;

  • empty():判断链表是否为空;

  • reverse():反转链表,时间复杂度O(n);

  • sort():链表内部排序(非标准库通用sort,因通用sort需随机访问迭代器),时间复杂度O(n log n);

  • unique():删除连续重复的元素(需先排序),时间复杂度O(n);

  • splice():合并两个链表,无需拷贝元素,仅调整指针,时间复杂度O(1)(按位置合并)或O(n)(按范围合并)。

list<int>lst1={3,1,4,2};list<int>lst2={5,6};lst1.sort();// 排序:[1,2,3,4]lst1.unique();// 无连续重复,保持不变lst1.reverse();// 反转:[4,3,2,1]// 把lst2的所有元素插入到lst1头部lst1.splice(lst1.begin(),lst2);// lst1: [5,6,4,3,2,1], lst2: 空

四、适用场景

list的特性决定了它并非“万能容器”,需根据实际场景选型:

1. 优先使用list的场景

  • 频繁在任意位置插入、删除元素(尤其是中间位置),且元素个数动态变化较大;

  • 需要保证迭代器稳定性,插入/删除后无需重新获取迭代器;

  • 无需随机访问元素,仅需双向遍历;

  • 需要高效合并两个链表(splice接口优势)。

2. 优先使用其他容器的场景

  • 需要随机访问元素(如下标访问):优先选择vector、array;

  • 元素个数固定或变化不大,且以遍历、读取为主:优先选择vector。

  • 需要在尾部高效插入/删除,且支持随机访问:vector(尾部操作O(1));

  • 存储小型数据(如int),追求空间利用率:vector(无指针额外开销)。

五、注意事项

1. 迭代器失效

list的迭代器仅在对应节点被删除时失效,其他情况(插入、移动)均有效。因此在遍历删除时,需注意保存下一个迭代器:

// 错误写法:erase后it失效,++it会出错for(autoit=lst.begin();it!=lst.end();++it){if(*it%2==0){lst.erase(it);// it失效}}// 正确写法:利用erase返回的迭代器for(autoit=lst.begin();it!=lst.end();){if(*it%2==0){it=lst.erase(it);// 接收下一个有效迭代器}else{++it;}}

2. 排序与算法适配

标准库的std::sort要求迭代器支持随机访问,而list的迭代器是双向迭代器,不满足要求,因此必须使用list自带的sort()成员函数,不可直接调用std::sort(lst.begin(), lst.end())。

3. 遍历效率优化

由于list的节点分散,遍历效率低于vector。若需频繁遍历,且元素个数不频繁变化,可考虑将list转为vector后遍历(一次性拷贝开销可抵消多次遍历的低效)。

六、总结

STL list是一款针对性极强的容器,其核心价值在于高效的任意位置插入/删除操作和稳定的迭代器特性,同时也因双向链表的底层结构存在随机访问能力缺失、缓存命中率低等局限。合理的进行选型,才能充分发挥STL容器的性能优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1188008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HY-MT1.5-1.8B量化对比:云端FP16 vs INT8实测数据

HY-MT1.5-1.8B量化对比&#xff1a;云端FP16 vs INT8实测数据 你是不是也遇到过这样的问题&#xff1a;模型效果不错&#xff0c;但部署成本太高&#xff1f;尤其是像翻译这种高频调用的服务&#xff0c;既要保证响应速度&#xff0c;又要控制服务器开销。这时候&#xff0c;模…

英雄联盟智能助手:你的专属游戏数据分析师

英雄联盟智能助手&#xff1a;你的专属游戏数据分析师 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为游戏中的决策困惑而烦…

无源蜂鸣器在家电提示音中的应用:入门必看指南

无源蜂鸣器在家电提示音中的应用&#xff1a;从原理到实战的完整指南你有没有注意过&#xff0c;当你按下微波炉“开始”键时&#xff0c;那声清脆的“嘀”&#xff1f;或者洗衣机完成洗涤后&#xff0c;连续两声“嘀—嘀—”的提示&#xff1f;这些看似简单的反馈声音&#xf…

颠覆传统:Plex直播系统的模块化架构设计与技术实现

颠覆传统&#xff1a;Plex直播系统的模块化架构设计与技术实现 【免费下载链接】IPTV.bundle Plex plug-in that plays live streams (like IPTV) from a M3U playlist 项目地址: https://gitcode.com/gh_mirrors/ip/IPTV.bundle 引言&#xff1a;重新定义家庭媒体中心 …

Qwen-Image-Layered全面解读:云端免配置环境最佳实践

Qwen-Image-Layered全面解读&#xff1a;云端免配置环境最佳实践 你是否也遇到过这样的情况&#xff1a;业务部门突然提出一个AI图像处理需求&#xff0c;要求一周内出效果&#xff0c;但IT采购流程走完至少要一个月&#xff1f;GPU服务器还在审批&#xff0c;项目却已经等不及…

暗黑破坏神2单机存档自定义大师:d2s-editor全方位使用手册

暗黑破坏神2单机存档自定义大师&#xff1a;d2s-editor全方位使用手册 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 想要在暗黑破坏神2的单机世界中自由驰骋吗&#xff1f;d2s-editor这款基于Web的存档编辑器将为您打开通往无…

Qwen3-4B-Instruct实战:小说创作从构思到完成的AI辅助全流程

Qwen3-4B-Instruct实战&#xff1a;小说创作从构思到完成的AI辅助全流程 1. 引言&#xff1a;AI写作的新范式 1.1 小说创作的痛点与挑战 传统的小说创作过程往往依赖于作者长期的知识积累、灵感迸发和持续输出能力。然而&#xff0c;在实际写作中&#xff0c;创作者常面临以…

如何快速转换B站缓存视频:m4s-converter的完整使用指南

如何快速转换B站缓存视频&#xff1a;m4s-converter的完整使用指南 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 还在为B站缓存视频只能在特定客户端播放而烦恼吗&#xff1…

PostgreSQL实战:如何用 CTE(公用表表达式)解决复杂的查询逻辑

文章目录一、为什么需要 CTE&#xff1f;1.1 传统复杂查询的痛点1.2 CTE 的核心优势1.3 CTE vs 临时表 vs 视图1.4 CTE 的核心价值二、CTE 基础语法2.1 多 CTE 链式组合三、实战场景3.1 场景1&#xff1a;计算用户活跃度指标&#xff08;替代嵌套子查询&#xff0c;提升可读性&…

Vue3树形选择组件完全指南:快速构建层级数据选择功能

Vue3树形选择组件完全指南&#xff1a;快速构建层级数据选择功能 【免费下载链接】vue3-treeselect tree select component for vue 3 (next) 项目地址: https://gitcode.com/gh_mirrors/vu/vue3-treeselect Vue3树形选择组件Vue3-Treeselect为开发者提供了强大的树状下…

3个高效微调框架推荐:Unsloth镜像免配置低价试遍

3个高效微调框架推荐&#xff1a;Unsloth镜像免配置低价试遍 你是不是也遇到过这种情况&#xff1f;作为一个独立开发者&#xff0c;手头有个不错的私有模型想优化一下&#xff0c;结果一打开 Hugging Face&#xff0c;满屏都是类似的微调工具&#xff1a;LoRA、QLoRA、Unslot…

效果展示:通义千问2.5-7B生成的8K长文本有多强?

效果展示&#xff1a;通义千问2.5-7B生成的8K长文本有多强&#xff1f; 1. 引言 随着大语言模型在自然语言处理领域的持续演进&#xff0c;长文本生成能力已成为衡量模型综合性能的重要指标之一。尤其在报告撰写、小说创作、技术文档生成等场景中&#xff0c;模型能否稳定输出…

Visual C++运行库修复完全指南:解决系统兼容性问题的终极方案

Visual C运行库修复完全指南&#xff1a;解决系统兼容性问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 概述 VisualCppRedist AIO是一个集成了最…

Visual C++运行库智能修复系统:告别程序崩溃的终极方案

Visual C运行库智能修复系统&#xff1a;告别程序崩溃的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为软件频繁闪退、游戏卡顿、DLL文件缺失而烦…

容器化测试环境自动部署与回收:2026年实战指南

容器化测试环境的时代意义‌ 在2026年的软件测试领域&#xff0c;容器化技术已成为提升效率的核心驱动力。随着微服务和云原生架构的普及&#xff0c;测试环境的管理面临资源浪费、环境不一致等挑战。容器化&#xff08;如Docker和Kubernetes&#xff09;通过轻量级、隔离的容…

儿童编程启蒙利器:ScratchJr桌面版全方位体验指南

儿童编程启蒙利器&#xff1a;ScratchJr桌面版全方位体验指南 【免费下载链接】ScratchJr-Desktop Open source community port of ScratchJr for Desktop (Mac/Win) 项目地址: https://gitcode.com/gh_mirrors/sc/ScratchJr-Desktop 想让孩子在玩乐中学习编程思维&…

B站缓存视频格式转换全攻略:从m4s到MP4的完美解决方案

B站缓存视频格式转换全攻略&#xff1a;从m4s到MP4的完美解决方案 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当心爱的B站视频突然下架&#xff0c;那些精心缓存的m4s文件…

DeepSeek-R1-Distill-Qwen-1.5B API调用指南:Python客户端配置详解

DeepSeek-R1-Distill-Qwen-1.5B API调用指南&#xff1a;Python客户端配置详解 1. 引言 1.1 学习目标 本文旨在为开发者提供一份完整的 DeepSeek-R1-Distill-Qwen-1.5B 模型 API 调用实践指南&#xff0c;涵盖从模型服务启动、本地部署验证到 Python 客户端封装与调用的全流…

鸿蒙跨端框架 Flutter 学习 Day 6:Future 在 UI 渲染中的心跳逻辑

前言&#xff1a;从异步逻辑到视觉律动 在上一篇中&#xff0c;我们探讨了异步编程的底层哲学。然而&#xff0c;在鸿蒙应用开发的工程实践中&#xff0c;开发者不仅要解决“数据如何加载”的问题&#xff0c;更要解决“状态如何反馈”的问题。 异步数据加载的过程&#xff0…

英雄联盟自动化工具League Akari:快速上手指南

英雄联盟自动化工具League Akari&#xff1a;快速上手指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 想要轻松掌握英雄联盟游…