首页 > 其他分享 >4月10日list学习

4月10日list学习

时间:2023-04-10 20:24:57浏览次数:50  
标签:10 const 迭代 list 学习 拷贝 节点 指针

无论是string还是vector或者list他们的迭代器都有类似于指针的行为,解引用时都能访问其中的数值。

2.list重载->运算符时比较奇怪,

就像这样子,迭代器返回一个日期类型的指针,所以it-->的返回值是data的指针,常理来说应该是it->->-day才对,所以这里应该是省略了一个->运算符。

3.this指针指当前对象的整体指针,若是要对this指针做运算符运算,类里面应该有预期的运算符重载而达成目标。

4.list的析构函数不同于顺序结构的析构,因为他的空间是一个个分散的空间,所以得找到一个析构一个,可以用循环遍历和erase函数结合使用来清空list中的数据,再用delete释放list的头节点。就像下面这样

记得析构一块连续空间是要加[],其他不加哦,不然就坑了,写出了一个大bug。代码习惯一定要好,不然改都没法改。

然后就是比较麻烦的点了

1.迭代器是一个很好用的东西,在学习string时发现迭代器定义就是头尾指针,很简单,到使用vector的迭代器时发现它的成员变量就是重定义的迭代器,分别指向空间的头,最后一个有效数据的地址,和实际空间的最后一个地址,而list的迭代器是一个类它需要有前后指针来完成迭代操作,但是迭代器总共有四种,const和普通的,与逆置的,所以为了变量类型不同再写一个类未免太麻烦了。于是可以用类模板来实现不同的迭代器,当参数传入const类型时自动调用const迭代器,根据模板来完成迭代。但是如果单纯的给普通迭代器加上const修饰可能并不能解决问题,因为list的节点可能是多种不同类型的嵌套,而只给节点指针用const修饰而节点的引用和解引用没有被const限制,可能会导致节点的引用和解引用值被修改,所以在模板上就需要加上限制后两个参数实现,如图,

如果类中传入一个const修饰的实例化对象。那么对象就会根据参数进入const—iterator,又因为const_iterator的后两个参数只读所以他的&和*都不能被改变从而达成了只读迭代器的效果。

所以灵活运用模板可以很好的简化代码量,

但是再进行上述过程中遇到了一个问题,再写第二个模板是不小心将T本身也写成了const导致程序编译失败,找了很久不知道问题出在哪里,就像这样

可以看到第65行的第一个模板参数被加了const修饰,下面报错,因为是初学者也不知道是怎么回事,于是猜想可能是传参的时候实例化对象已经被const修饰,不能在发生一些其他的类型转换所以编译不过。

最后总结几个小问题:

1.STL类中end函数返回最后一个数的下一个位置,若是循环列表则end返回头指针。begin函数返回头指针的下一个位置,

2.在学习了string,vector和list总结他们的构造函数,拷贝构造以及重载=运算符有何不同:

string比较简单,他的构造就是开辟一段连续空间,拷贝的话就是先开辟空间再用memcpy函数就可以拷贝,并不涉及浅拷贝的问题。因为他储存的类型就是串。

 

vector的构造:虽然他也是一片连续的空间但是他储存的类型可以不只是内置类型,所以他开辟空间的类型取决于他存储的类型,因为vector在使用的时候需要标明用来储存什么样的信息。所以构造函数先将各个指针置为空,再插入的时候开辟空间,而他的拷贝构造就和string不一样了这里不在可以用memcpy拷贝因为可能会出现浅拷贝现象,导致delete出错,比如它里面存类的实例化对象,memcpy只会原封不动的拷贝指针变量,导致delete两次崩溃,重载=运算符也是同理。

 

list的构造:list的构造因为已经有了定义好的节点,所以无参构造就是初始化一个头节点,给头节点开一个空间,并且前后指针指向自己,而他的拷贝构造就是利用迭代器不断插入被拷贝对象的数据,这里有一个问题list声明了三个类分别是本身,节点,和迭代器,那么其他两个要不要手动写析构函数呢?

最后是这样子想的,_list_node有三个变量前两个指针变量的指向在list的析构中就被置为空了,因为在不断删除下就剩一个头节点,并且是循环指向自己,所以被干掉了,而T类型若是内置类型系统自己会干掉,若是类对象,则析构的任务就有对应类对象来完成,,所以这个不需要手动去写析构函数。那迭代器呢,迭代器就更不用了因为迭代器本身所用的空间就是list的空间,他会随着list释放跟着释放,但是——node最后会成为野指针吧,所以保险期间加上析构函数吧

然后关于上述三个类的构造函数就是这样了,还有一个点,当重载等于运算符是可以不传引用,利用他的拷贝构造的临时变量特性,交换数据就可以节省代码量,

然后就是类型不同物理意义相同的变量不能混为一谈,比如上述的node*和迭代器他们虽然都是节点的指针但是解引用却不同,node解引用得到一个节点,而迭代器解引用得到重载后的变量。

链表使用insert可能不会失效因为他是将节点插入在迭代器的前面。当前迭代器指向没有变,而顺序结构插入可能引起增容导致当前迭代位置换地址或者被释放,引起错误

标签:10,const,迭代,list,学习,拷贝,节点,指针
From: https://www.cnblogs.com/qjwxlj/p/17304164.html

相关文章

  • 1019. 链表中的下一个更大节点
    题目链接:1019.链表中的下一个更大节点方法:单调栈解题思路该类问题详解:单调栈解决NextGreaterNumber一类问题代码classSolution{public:vector<int>nextLargerNodes(ListNode*head){vector<int>value;while(head!=nullptr){......
  • 学习笔记394—Windows 10 MySQL 数据库安装
    Windows10MySQL数据库安装1、MySQL的安装方式MySQL的社区版(MySQLCommunity)是免费的、开源的,像企业版这些是收费的,学习阶段使用社区版的即可。MySQL社区版在Windows10的安装方式可以分为两种,一种是使用安装程序安装,另一种是使用压缩包安装。个人倾向于使用压缩包......
  • 前端学习 node 快速入门 系列 —— 项目版权格式化
    其他章节请看:前端学习node快速入门系列项目版权格式化需求替换整个项目的版权信息,替换文件为.c和.h结尾。分析版权信息通常都在文件开头,通过是否有copyright来判断是替换版权还是新增版权实现通过node读取文件,过滤出.c、.h文件,然后用正则判断是替换版权还......
  • CS231N assignment 1 _ 图像特征 学习笔记 & 解析
    利用图像特征提升准确度我们之前仅仅是逐个像素的计算,而忽视和图像在HSV空间的像素集中度和图像纹理特征.根据别人的博客,准确率进一步从54%提升到58%.下面进行解析.HOG/颜色直方图代码解读本次的作业没有要求我们自己实现,但是我们还是应该读懂代码. 在前面,我们一直......
  • 2023.4.10每日总结
    html分页展示<%@pageimport="wangzhan.Pd_zhengce"%><%@pageimport="wangzhan.Thesql"%><%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><!D......
  • 4月10日课后总结
    4/10课后总结SQL注入问题importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True......
  • python统计list中出现最多的数字
    要统计一个Python列表中出现最多的数字,可以使用Python内置的collections模块中的Counter类。Counter类可以用于统计可迭代对象中每个元素的出现次数,返回一个字典,其中键是元素,值是元素出现的次数。然后,可以使用Python内置的max()函数找到字典中的最大值。以下是一个示例代码:from......
  • 深度学习环境配置
    深度学习环境配置一、软硬件配置介绍操作系统:Windows10和Ubuntu20.04均适用GPU:NvidiaGeforceRTX3060Python:3.8二、环境配置步骤1、安装显卡驱动(1)Windows10​ 在Nvidia驱动下载官网下载522.25版本的驱动并安装。(2)Ubuntu20.04​ 打开系统设置,找到软件更新......
  • 10种经典的时间序列预测模型 本文演示了 10 种不同的经典时间序列预测方法
    [matlab]10种经典的时间序列预测模型本文演示了10种不同的经典时间序列预测方法,它们是1)自回归(AR)2)移动平均线3)自回归移动平均线4)自回归积分移动平均线(ARIMA)5)季节性自回归积分移动平均线(SARIMA)6)具有外生回归量的季节性自回归综合移动平均线(SARIMAX)......
  • 2023年4月10日周一
    计划准备中期答辩熟悉项目,修改项目,开发新功能执行上午:解决下拉权限修改的问题,删除13点39分  开始14点09分  干别的了,熟悉项目,准备中期答辩记录已解决解决下拉权限修改的问题,删除问题想法管理员删除用户,新增用户??mock地址有问题??没解决审批问题,发邮件问题权......