首页 > 编程语言 >C++笔记9•list•

C++笔记9•list•

时间:2024-08-27 11:23:58浏览次数:14  
标签:迭代 list 笔记 erase C++ array 节点 指针

容器之list

1.list的介绍

(1).list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 (2).list的底层是 双向循环链表结构 ,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 (3).优缺点 优点 :与其他的序列式容器相比 (array , vector , deque) , list 通常在任意位置进行插入、移除元素的执行效率更好。 list 最大的 缺陷 :不支持任意位置的随机访问,比如:要访问 list的第5 个元素,必须从已知的位置 ( 比如头部或者尾部 ) 迭代到该位置,在这段位置上迭代需要线性的时间开销。

2. list的使用

list官方文档介绍

构造函数、拷贝构造、析构函数、迭代器、容量空间、增删查改接口

3.list迭代器失效 

迭代器失效即迭代器所指向的节点的无效,即该节 点被删除了 。因为 list 的底层结构为带头结点的双向循环链表 ,因此 list 中进行插入时是不会导致 list 的迭代 器失效的,只有在 删除 时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响 。 注意: list迭代器的实现 与string和vector不一样,list的迭代器是将指针封装在一个结构体中,传统的只用一个指针来表示list迭代器,不足以实现list迭代器的功能,只要还是因为list是个链表,里面是一个个节点组成的,需要从堆上申请,造成 在逻辑上是连续的,在物理结构上不⼀定连续。  传统的指针++操作,就直接到下一个指针了,但是list如果单纯++,是不能指向下一个指针的,需要进行运算符重载来实现这个功能。
void TestListIterator()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值
 l.erase(it); 
 ++it;
 }
}

//解决方案:
void TestListIterator()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 // erase()函数执行后,it所指向的节点已被删除,因此it无效,erase()返回值是个迭代器 返回下一个节点的迭代器。在下一次使用it时,必须先给其赋值
 it=l.erase(it); 
 }
}

※注意:防止迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

标签:迭代,list,笔记,erase,C++,array,节点,指针
From: https://blog.csdn.net/qq_64446190/article/details/141596732

相关文章

  • C++学习 — 函数
    目录1.概述2.函数的定义3.函数的调用4.值传参5.函数的常见样式6.函数的声明7.函数的分文件编写8.函数默认参数 9.函数占位参数10.函数重载(1)函数重载概述(2)函数重载注意事项1.概述作用:将一段经常使用的代码封装起来,减少重复代码   一个较大的程序,一般......
  • Java基础-学习笔记14
    14集合Collection、Map第一部分Collection的框架体系1)可以动态保存任意多个对象,使用比较方便2)提供了一系列方便的操作对象的方法:add、remove、set、get等3)使用集合添加、删除新元素简单便捷。集合Collection主要是两组:单列集合,双列集合List、Set是存储单列的数据......
  • 202009-1 称检测点查询 csp c++组
    a数组记录距离平方值,其最大为2000的平方,不超int。b数组记录3个距离最小的坐标。ans记录下标。每次选出一个坐标后其距离置为最大值。include<bits/stdc++.h>typedeflonglongll;usingnamespacestd;intmain(){intn,x,y,x1,y1,j,minx,b[3],cnt=0,i,ans;inta[210......
  • C/C++开发神器CLion全新发布v2024.2——更适用于嵌入式开发
    CLion是一款专为开发C及C++所设计的跨平台IDE。它是以IntelliJ为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OSX和Windows上来开发C/C++,同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CMake编译系统,从而提高......
  • 【实践经验】端口被占用问题:listen tcp:bind:only one usage of each socket address
    文章目录一.问题描述二.分析1.适用错误三.解决方法1.打开控制台2.查看端口的使用情况2.1不知道端口号——查看所有运行的端口2.2知道端口号3.查看使用进程的程序4.杀死进程5.验证端口是否释放一.问题描述goland启动项目后报错:“listentcp:bind:onl......
  • C++码表之Unicode
    今日诗词:折花逢驿使,寄与陇头人。江南无所有,聊赠一枝春。                     ——《赠范晔诗》【南北朝】陆凯引言:上一期我们说到了ASCII码表,这是一种现如今不是那么通用的机制,随着计算机的普及,越来越多的人开始学习计算机,深......
  • C++容器之字符串的详解
    每日诗词:我见青山我妩媚,料青山见我应如是。                             ——《贺新郎·甚矣吾衰矣》【宋】辛弃疾目录补漏:vector在分配新内存块后如何进行元素复制正文:字符串变量和常量字符串变量:解析:......
  • 学习C++的阶段总结
    每日诗词:盛气光引炉烟,素草寒生玉佩。应是天仙狂醉,乱把白云揉碎。                        ——《清平乐·画堂晨起》【唐】李白目录月末学习总结展望和感谢通知我的目标是:共同进步下期预告:搞定C++指针;更新时间:待定......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • 调用ArrayList的add方法抛异常UnsupportedOperationException
    调用ArrayList的add方法抛异常UnsupportedOperationException对于一些想要把数组转成List的需求,可能会使用到Arrays.asList()获取List对象,但是这里面也存在一些问题。示例代码如下voidtest1(){List<Object>list=Arrays.asList();list.add("hello");......