news 2026/10/17 5:42:11

【c++】STL-容器list的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【c++】STL-容器list的使用

hello~ 很高兴见到大家! 这次带来的是C++中关于list容器这部分的一些知识点,如果对你有所帮助的话,可否留下你的三连呢?
个 人 主 页: 默|笙


文章目录

  • 一、list的构造
  • 二、迭代器分类
  • 三、Operations成员函数
    • 3.1 sort(了解)
      • 高速缓存命中率
    • 3.2 其他的一些函数需要注意的点

关于list:

  1. 在c++的STL模板库里,list通常被实现为一个带哨兵节点(头节点)的循环双向链表。了解list
  2. 使用 list 模板需要包含头文件list。
  3. 通过list体会iterator迭代器遍历的优势:它是通用的相似的遍历容器的方式,并且其封装了容器的底层,屏蔽了容器结构的差异和底层实现细节,不会因容器的不同或者差异而更改。—iterator迭代器的封装特性
  4. 迭代器的复用特性:实现算法时用迭代器函数模板方式实现,跟底层容器解耦。例如:在实现reverse逆置函数时,我们不用特意为了一个容器去根据它的结构专门为它设计一个算法,而是设计一个通用的算法,所有类型都可以使用。

一、list的构造

接下来,我会讲解除了move构造之外的构造的一些小知识点。

  1. 迭代器区间构造:迭代器区间构造它任意类型的类型迭代器实现构造,就比如vector类型,同时,除支持迭代器之外,它也支持通过指针来进行构造(可以认为指针是一种特殊的迭代器)。
//一般都会有这样几个构造list<int>lt1;//默认构造=defaultlist<int>lt2(10,1);//n个val填充构造-tillvector<int>v1={1,2,3,4,5};list<int>lt3(v1.begin(),v1.end());//迭代器区间构造-range,可以传递vector类型指针list<int>lt4={1,2,3,4,5};//初始化列表构造-initializerlist<int>lt5=lt4;//拷贝构造-copy//迭代器区间构造可以传数组的指针inta[]={1,2,11,3,4,5,40};list<int>lt6(a,a+4);//注意格式
  1. 编译器的特殊处理:list的结构是由一个一个的节点组成的,但在监视窗口里,它却跟物理空间连续的数组一样显示数据而非一个一个节点,这是因为编译器的特殊处理。它的底层并不是这样。

二、迭代器分类

我们能够通过函数原型观察到,迭代器也是有分类的,那么它有哪些类型呢?

  1. 迭代器可以根据功能分为**输入(只读)(Input)、输出(只写)(Output)、单向(Forward),双向(Bidirectional)和随机(Random)**五类迭代器,且它们之间存在一定的包含关系。
  2. 单向类迭代器**支持++操作,双向类迭代器支持++与–操作,随机类迭代器支持++、–、+与-**操作。vector的迭代器是随机迭代器,list的迭代器是双向迭代器。
  3. 可以认为单向(Forward)迭代器是特殊的只读(Input)迭代器,双向(Bidirectional)迭代器是特殊的单向(Forward)迭代器,随机迭代器(Random)是特殊的双向(Bidirectional)迭代器。

  1. 按照上图,若一个函数要求的是Input迭代器,那么Input后面被包含的迭代器也符合要求;依此类推,要求Forward迭代器的,Bidirectional和Random迭代器都符合要求,要求Random迭代器的,只有Random迭代器符合要求。

三、Operations成员函数

3.1 sort(了解)

由于算法库里的sort要求Random迭代器,list 无法使用,所以 list 里有专门实现的它的sort函数。

  1. 在release版本下,list的sort运行效率比vector的sort要低很多,一般不推荐使用前者,尤其是数据量大的时候。
  2. 推荐先将list内的数据拷贝到vector里面,然后用vector里的sort排完序之后再拷贝回去,比使用list的sort要快。
    可以用下面两段代码来验证:
srand(time(0));constintN=100000;list<int>lt1;vector<int>v;for(inti=0;i<N;++i){autoe=rand()+i;//由于函数特性,rand函数只能生成3万多个随机数,而我们需要10万个lt1.push_back(e);v.push_back(e);}intbegin1=clock();// 排序sort(v.begin(),v.end());intend1=clock();intbegin2=clock();lt1.sort();intend2=clock();printf("vector sort:%d\n",end1-begin1);printf("list sort:%d\n",end2-begin2);

srand(time(0));constintN=1000000;list<int>lt1;list<int>lt2;for(inti=0;i<N;++i){autoe=rand()+i;lt1.push_back(e);lt2.push_back(e);}intbegin1=clock();// 拷贝vectorvector<int>v(lt2.begin(),lt2.end());// 排序sort(v.begin(),v.end());// 拷贝回lt2lt2.assign(v.begin(),v.end());intend1=clock();intbegin2=clock();lt1.sort();intend2=clock();printf("list copy vector sort copy list sort:%d\n",end1-begin1);printf("list sort:%d\n",end2-begin2);

  1. 这与cpu高速缓存命中率有关,那么什么是高速缓存命中率?

高速缓存命中率

  1. cpu访问内存:(cpu太快,它会先加载到三级缓存里面)

1. 数据在不在缓存,在缓存就叫命中,不在就叫不命中.
2. 不在缓存,先加载到缓存,再访问。

  1. cpu一次不是只读取一个字节,而是读取好些个字节,具体多少跟硬件的设计有关系。

  2. 如图:由于结构的差异,对于数组(vector这种),cpu只需要加载一次缓存,后面的数据就都命中了(加载到缓存);但对于链表(list这种),cpu虽然也会加载一长段连续的内存,但之后的节点大概率不在这段内存里,对于之后的数据都是不命中,都需要cpu重新一次次的加载到缓存里。所以说,数组的高速缓冲命中率高,访问效率高,链表则低。

3.2 其他的一些函数需要注意的点

  1. merge(合并):使用的时候必须得保证有序。
  2. unique(去重):相同的只留下一个,前提也是要先排序。
  3. remove(删除):会删除所有的给定值,不要求有序。
  4. splice(接合):可以剪切部分节点粘贴到指定位置。
  5. 因为用的不多,可以先了解一下,需要用的时候去查就行。

今天的分享就到此结束啦,如果对读者朋友们有所帮助的话,可否留下宝贵的三连呢~~
如果可以, 那就让我们共同努力, 一起走下去!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 5:42:00

GitHub_Trending/templa/templates模板使用统计:最受欢迎的10个模板分析

GitHub_Trending/templa/templates模板使用统计&#xff1a;最受欢迎的10个模板分析 GitHub_Trending/templa/templates是基于开源新版QD框架站发布的公共har模板库&#xff0c;提供了丰富的网站自动化操作模板&#xff0c;帮助用户轻松实现各类网站的签到、数据获取等功能。下…

作者头像 李华
网站建设 2026/10/17 5:40:52

Webpack核心原理与企业级构建实战指南

1. 项目概述&#xff1a;为什么Webpack不是“配菜”&#xff0c;而是前端工程的主厨&#xff1f;“【谷粒学院】013-Webpack”这个标题乍看像一门课程编号&#xff0c;但背后藏着一个真实到骨子里的行业切口——它不是教你怎么写console.log(Hello)&#xff0c;而是在教你怎么把…

作者头像 李华
网站建设 2026/10/17 5:40:47

Lokinet源码编译详解:从零开始构建完整的匿名网络栈

Lokinet源码编译详解&#xff1a;从零开始构建完整的匿名网络栈 Lokinet是一个匿名、去中心化且基于IP的互联网覆盖网络&#xff0c;通过源码编译可以让你深入了解其底层架构并定制适合自己需求的匿名网络栈。本文将带你逐步完成从环境准备到最终编译的全过程&#xff0c;即使…

作者头像 李华
网站建设 2026/10/17 5:40:38

MySQL故障排查实战:连接数、慢查询与主从延迟的处置方案

凌晨 2 点 14 分&#xff0c;某电商平台的监控大屏弹出一条告警&#xff1a;数据库连接数飙到上限&#xff0c;业务超时率直线上升。值班同事的第一反应是重启数据库&#xff0c;被我拦住了——这个动作在多数场景下不但救不了火&#xff0c;反而会把问题拖进更深的泥潭。搞 My…

作者头像 李华
网站建设 2026/10/17 5:40:37

软考 系统架构设计师历年真题集萃(79)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(78) 第141题 软件测试一般分为两个大类:动态测试和静态测试。前者通过运行程序发现错误,包括()等方法;后者采用人工和计算机辅助静态分析的手段对程序进行检测,包括()等方法。 第1空 A. 边界值分析、逻辑覆…

作者头像 李华
网站建设 2026/10/17 5:39:26

自托管云开发结合AI编码代理:用Coder构建可重建的工作区环境

1. 自托管云开发解决什么问题&#xff1a;环境漂移和AI代理的落户问题Coder 这个名字听起来像是一个通用编程工具的代称&#xff0c;但它的实际定位是&#xff1a;一个能把自托管云开发环境和 AI 编码代理组合在同一套工作区体系里的平台。简单说&#xff0c;你在浏览器里打开一…

作者头像 李华