C++的List类(一):List类的基本概念

news2025/1/29 13:47:53

目录

前言

List类的基本概念

List的构造函数

List类迭代器的使用

List的功能

List的元素访问

List与vector比较


前言

  • vector的insert和erase都会导致迭代器失效
  • list的insert不会导致迭代器失效,erase会导致迭代器失效

  • insert导致失效的原因是开辟了新空间后,迭代器扔指向原空间
  • erase导致失效的原因是销毁的空间不是连续的空间,迭代器找不到下一块小空间的位置

List类的基本概念

List类的文档:cplusplus.com/reference/list/list/?kw=list

1、list是在常数范围内的任意位置进行插入和删除的序列容器,可以向前向后双向迭代

2、list的底层是双向链表结构

3、list和forword_list相似,但后者是单链表,且只能向前迭代

4、和array、vector等容器相比,list可以在任意位置插入、删除元素,效率高

5、list的缺点是不支持随机访问、额外开辟空间存放结点信息、查找效率低需要遍历整个链表

List的构造函数

构造函数
接口说明
list (size_type n, const value_type& val = value_type())
构造的list中包含n个值为val的元素
list()
构造空的list
list (const list& x)
拷贝构造函数
list (InputIterator first, InputIterator last)
用[first, last)区间中的元素构造list
// list的构造
void TestList1()
{
    list<int> l1;                         //构造空的l1
    list<int> l2(4, 100);                 //l2中放4个值为100的元素
    list<int> l3(l2.begin(), l2.end());   //用l2的[begin(), end())左闭右开的区间构造l3
    list<int> l4(l3);                     //用l3拷贝构造l4

    //以数组为迭代器区间构造l5
    int array[] = { 16,2,77,29 };
    list<int> l5(array, array + sizeof(array) / sizeof(int));

    //列表格式初始化
    list<int> l6{ 1,2,3,4,5 };//C++11的initializer_list,多参数构造函数会发生隐式类型转换

    //用迭代器方式打印l5中的元素
    list<int>::iterator it = l5.begin();
    while (it != l5.end())
    {
        cout << *it << " ";
        ++it;
    }       
    cout << endl;

    // C++11范围for的方式遍历
    for (auto& e : l5)
        cout << e << " ";

    cout << endl;
}

List类迭代器的使用

函数声明
接口说明
begin +
end
返回第一个元素的迭代器、返回最后一个元素下一个位置的迭代器
rbegin +
rend
返回第一个元素的reverse_iterator,即end位置 (最后一个元素下一个位置的迭代器) 返回最后一个元素下一个位置的reverse_iterator,即begin位置 (第一个元素的迭代器)
  1. begin和end为正向迭代器,对迭代器执行++操作,迭代器向后移动
  2. rbegin和rend为反向迭代器,对迭代器执行++操作,迭代器向前移动
// list迭代器的使用
// 注意:遍历链表只能用迭代器和范围for
void PrintList(const list<int>& l)
{
    // 注意这里调用的是list的 begin() const,返回list的const_iterator对象
    for (list<int>::const_iterator it = l.begin(); it != l.end(); ++it)
    {
        cout << *it << " ";
        // *it = 10; 编译不通过
    }

    cout << endl;
}

void TestList2()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array + sizeof(array) / sizeof(array[0]));
    // 使用正向迭代器正向list中的元素
    // list<int>::iterator it = l.begin();   // C++98中语法
    auto it = l.begin();                     // C++11之后推荐写法
    while (it != l.end())
    {
        cout << *it << " ";
        ++it;
    }
    cout << endl;

    // 使用反向迭代器逆向打印list中的元素
    // list<int>::reverse_iterator rit = l.rbegin();
    auto rit = l.rbegin();
    while (rit != l.rend())
    {
        cout << *rit << " ";
        ++rit;
    }
    cout << endl;
}

List的功能

函数声明
接口说明
empty
检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数
push_front头插
pop_front头删
push_back尾插
pop_back尾删
insert指定位置插入
erase删除指定位置的元素
swap交换两个list中的元素
clear清空list中的有效元素
// list插入和删除
// push_back/pop_back/push_front/pop_front
void TestList3()
{
    int array[] = { 1, 2, 3 };
    list<int> L(array, array + sizeof(array) / sizeof(array[0]));

    // 在list的尾部插入4,头部插入0
    L.push_back(4);
    L.push_front(0);
    PrintList(L);

    // 删除list尾部节点和头部节点
    L.pop_back();
    L.pop_front();
    PrintList(L);
}

List的元素访问

函数声明
接口说明
front
返回list的第一个节点中值的引用
back
返回list的最后一个节点中值的引用

List与vector比较

vectorlist
底层结构
动态顺序表,一段连续空间
带头结点的双向循环链表
随机访问
支持随机访问,效率为O(1)
不支持随机访问, 效率为O(N)
插入和删除
任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容 (开辟新空间,拷贝元素,释放旧空间,导致效率更低)
任意位置插入和删除效率高,不 需要搬移元素,时间复杂度为 O(1)
空间利用率
底层为连续空间,不容易造成内存碎片,空间利用率
高,缓存利用率高
底层节点动态开辟,小节点容易 造成内存碎片,空间利用率低, 缓存利用率低
迭代器
原生指针
对原生指针(结点指针)进行封装
迭代器失效
在插入元素时,要给所有的迭代器重新赋值,因为插入
元素有可能会导致重新扩容,致使原来迭代器失效,删 除时,当前迭代器需要重新赋值否则会失效
插入元素不会导致迭代器失效, 删除元素时,只会导致当前迭代 器失效,其他迭代器不受影响
使用场景
需要高效存储,支持随机访问,不关心插入删除效率
大量插入和删除操作,不关心随 机访问

~over~

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

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

相关文章

Collection与数据结构 Stack与Queue(二):队列与Queue

1. 队列 1.1 概念 只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾&#xff08;Tail/Rear&#xff09; 出队列&#xff1a;进行删除操作…

css实现扫码循环扫描特效

摘要&#xff1a; 需求中需要模拟扫描的效果来实现户型的生成&#xff01;由于接口ai生成的图片户型时间比较长&#xff0c;所以需要模拟特效&#xff01; <!DOCTYPE html> <html><head><mate charset"UTF-8" /><title>扫描</title…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

Word一打开背景色全黑了,如何解决~

三天假期&#xff0c;大家应该没学习的吧&#xff01;哈哈哈&#xff0c;可是 office Word 趁大家玩的时候&#xff0c;偷偷加了个夜间模式&#xff0c;而且还是默认模式。一打开就是乌漆嘛黑一片黑底白字的 Word&#xff0c;这丑的样子让我无能为力&#xff0c;看的我头大。 …

深入浅出 -- 系统架构之负载均衡Nginx实现高可用

一、Nginx的高可用 线上如果采用单个节点的方式部署Nginx&#xff0c;难免会出现天灾人祸&#xff0c;比如系统异常、程序宕机、服务器断电、机房爆炸、地球毁灭....哈哈哈&#xff0c;夸张了。但实际生产环境中确实存在隐患问题&#xff0c;由于Nginx作为整个系统的网关层接入…

基于R语言BIOMOD2模型的物种分布模拟

随着生物多样性全球大会的举办&#xff0c;不论是管理机构及科研单位、高校都在积极准备&#xff0c;根据国家林草局最新工作指示&#xff0c;我国将积极整合、优化自然保护地&#xff0c;加快推进国家公园体制试点&#xff0c;构建以国家公园为主体的自然保护地体系。针对我国…

Visual Studio 配置代码风格审查工具cpplint

文章目录 一、Visual Studio 配置代码风格审查工具cpplint1、安装2、运行3、集成到Visual Studio4、集成到Git 前言 cpplint是一个用于检查C代码风格的工具&#xff0c;它可以帮助我们发现潜在的编码问题&#xff0c;提高代码质量。cpplint遵循Google的C编码规范&#xff0c;通…

机器学习——模型融合:平均法

机器学习——模型融合&#xff1a;平均法 在机器学习领域&#xff0c;模型融合是一种通过结合多个基本模型的预测结果来提高整体模型性能的技术。模型融合技术通常能够降低预测的方差&#xff0c;提高模型的鲁棒性&#xff0c;并在一定程度上提高预测的准确性。本文将重点介绍…

安装selenium和关于chrome高版本对应的driver驱动下载安装【Win/Mac 】

目录 一、查看自己电脑上chrome的版本 二、下载 ChromeDriver 三、安装selenium 法一&#xff1a;打开pycharm&#xff0c;点击File&#xff0c;Setting进入配置页面&#xff0c;点击Project下面的Python Interpreter进入环境配置页面&#xff0c;点击。输入selenium。之后…

JavaScript逆向爬虫——无限debugger的原理与绕过

debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字&#xff0c;只要遇到它&#xff0c;JavaScript 的执行便会在此处中断&#xff0c;进入调试模式。 有了 debugger 这个关键字&#xff0c;就可以非常方便地对 JavaScript 代码进行调试&#xff0c;比如使用 JavaSc…

zookeeper中的znode节点的一些功能和应用

zookeeper是一个挺好玩的东西 有着独特的选举机制&#xff0c;一般在中小型集群中&#xff0c;zookeeper一般装在三个节点 其中只有一个节点对外提供服务&#xff0c;处于leader状态&#xff0c;另外两台未follower状态 这得益于zookeeper独特的选举机制&#xff0c;可以保证le…

IP证书申请

目录 申请IP证书的基本条件&#xff1a; 申请和使用公网IP证书的过程&#xff1a; 为什么需要申请IP地址证书&#xff1f; 申请IP证书&#xff1a; IP证书又称公网IP地址证书&#xff0c;是一种特殊的SSL/TLS证书&#xff0c;其作用原理和普通的域名证书很像&#xff0c;域…

90天玩转Python—05—基础知识篇:Python基础知识扫盲,使用方法与注意事项

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

大规模基因检测成本降低,OceanBase助力基因测序普惠民众

本文来自OceanBase客户的分享 1990年10月&#xff0c;人类基因组计划正式拉开帷幕&#xff0c;它与曼哈顿原子弹计划和阿波罗登月计划并驾齐驱&#xff0c;被誉为二十世纪人类三大科学工程。这项宏伟的工程耗费了高达38亿美元的资金&#xff0c;历经13年&#xff0c;终于在2003…

P1123 取数游戏(dfs算法)

题目描述 一个 NM 的由非负整数构成的数字矩阵&#xff0c;你需要在其中取出若干个数字&#xff0c;使得取出的任意两个数字不相邻&#xff08;若一个数字在另外一个数字相邻 8个格子中的一个即认为这两个数字相邻&#xff09;&#xff0c;求取出数字和最大是多少。 输入格式 第…

将excel,csv中合并块中某条记录的值应用到整个块(使用多行的值,来填充新列数据)。

背景描述 在excel中使用其它列的值&#xff0c;根据某种计算规则来填充另一列&#xff08;或新列&#xff09;很容易实现。但是如果需要根据合并块中的多行来填充列时&#xff0c;就不容易实现&#xff0c;由于对excel不是太常用&#xff0c;因此这里使用的命令行工具实现的。…

全坚固笔记本丨工业笔记本丨三防笔记本相较于普通笔记本有哪些优势?

三防笔记本和普通笔记本在设计和性能方面存在显著差异&#xff0c;三防笔记本相较于普通笔记本具备以下优势&#xff1a; 三防笔记本通常采用耐磨、耐摔的材料&#xff0c;并具有坚固的外壳设计&#xff0c;能够承受恶劣环境和意外碰撞&#xff0c;有效保护内部组件不受损坏。相…

微信小程序真机无法下载文件

问题&#xff1a; 1、真机无法展示加了防盗链的图片 2、真机无法下载pdf等文件 文件服务器供应商&#xff1a;腾讯 解决&#xff1a; 1、在文件服务器控制台加上微信小程序的域名白名单&#xff1a;servicewechat.com 具体可查看&#xff1a;对象存储 设置防盗链-控制台指…

Python零基础从小白打怪升级中~~~~~~~入门

第一节&#xff1a;Python入门&#xff08;一&#xff09; 1、Python介绍 编程语言就是人和计算机进行交流的一种语言 Pythonc / CJavaPHPC#gobasicqbasicVBVCPython 是一个高层次的结合了解释性、编译性、互动性和面向对象&#xff0c;同时也面向函数的脚本语言。 Python 是…

Django之静态文件及模板语法(上)

Python学习之路系列文章目录 python面向对象之警察与匪徒火拼场景模拟python面向对像之第二次笔记Django环境搭建及测试第1个Django应用及Django的请求处理Django之静态文件及模板语法&#xff08;上&#xff09; 静态文件及模板语法 Python学习之路系列文章目录一、静态文件1.…