STL中list的使用

STL源码剖析——list容器的排序算法sort() 由于STL本身的排序算法sort接受的输入迭代器是随机访问迭代器,但是双向list链表容器的访问方式是双向迭代器,因此,不能使用STL本身的排序算法sort,必须自己定义属于自己访问的排序算法。我们从源码的剖析中,可以看到该排序算法思想类似于归并排序。 阅读详情

STL中list的使用:

STL中的list就是一双向链表,可高效地进行插入删除元素。现总结一下它的操作。

文中所用到两个list对象c1,c2分别有元素c1(10,20,30)  c2(40,50,60)。还有一个list<int>::iterator citer用来指向c1或c2元素。

list对象的声明构造():

A.      list<int>c0;                 //空链表

B.      list<int>c1(3);             //建一个含三个默认值是0的元素的链表

C.      list<int>c2(5,2);            //建一个含五个元素的链表,值都是2

D.      list<int>c4(c2);             //建一个c2的copy链表

E.       list<int>c5(c1.begin(),c1.end());  

//c5含c1一个区域的元素[_First, _Last)。

 

1.       assign()分配值,有两个重载:

c1.assign(++c2.begin(), c2.end()) //c1现在为(50,60)。

c1.assing(7,4)  //c1中现在为7个4,c1(4,4,4,4,4,4,4)。

2.       back()返回最后一元素的引用:

int i=c1.back();  //i=30

const int i=c2.back();  //i=60且不可修改

3.       begin()返回第一个元素的指针(iterator)

citer=c1.begin();    // *citer=10

list<int>::const_iterator cciter=c1.begin(); //*cciter=10且为const。

4.       clear()删除所有元素

c1.clear();   //c1为空  c1.size为0;

5.       empty()判断是否链表为空

bool B=c1.empty(); //若c1为空B=true;否则B=false;

6.       end()返回最后一个元素的下一位置的指针(list为空时end()=begin())

citer=c1.end(); //*(--citer)=30;

同begin()返回一个常指针,不能修改其中元素。

7.       erase()删除一个元素或一个区域的元素(两个重载)

c1.erase(c1.begin()); // c1现为(20,30);

c1.erase(++c1.begin(),c1.end()); // c1现为(10);

8.       front() 返回第一个元素的引用:

int i=c1.front(); //i=10;

const int i=c1.front(); //i=10且不可修改。

9.       insert()在指定位置插入一个或多个元素(三个重载):

c1.insert(++c1.begin(),100);   //c1(10,100,20,30)

c1.insert(c1.begin(),2,200);  //c1(200,200,20,30);

c1.insert(++c1.begin(),c2.begin(),--c2.end());

 //c1(10,40,50,20,30);

10.    max_size()返回链表最大可能长度(size_type就是int型):

list<int>::size_type i=c1.max_size();  //i=1073741823

11.    merge()合并两个链表并使之默认升序(也可改):

c2.merge(c1);   //c1现为空;c2现为c2(10,20,30,40,50,60)

c2.merge(c1,greater<int>()); //同上,但c2现为降序

12.    pop_back()删除链表尾的一个元素

c1.pop_back()  //c1(10,20);

13.    pop_front()删除链表头的一元素

c1.pop_front() //c1(20,30)

14.    push_back()增加一元素到链表尾

c1.push_back(100) //c1(10,20,30,100)

15.    push_front()增加一元素到链表头

c1.push_front(100) //c1(100,10,20,30)

16.    rbegin()返回链表最后一元素的后向指针(reverse_iterator or const)

list<int>::reverse_iterator riter=c1.rbegin(); //*riter=30

17.    rend()返回链表第一元素的下一位置的后向指针

list<int>::reverse_iterator riter=c1.rend(); // *(--riter)=10

18.    remove()删除链表中匹配值的元素(匹配元素全部删除)

c1.remove(10);     //c1(20,30)

19.    remove_if()删除条件满足的元素(会遍历一遍链表)

c1.remove_if( is_odd<int> () ); //c1(10,20,30) 

//is_odd自己写(表奇数) 

20.    resize()重新定义链表长度(两重载):

c1.resize(4)  //c1(10,20,30,0)用默认值填补

c1.resize(4,100) //c1(10,20,30,100)用指定值填补

21.    reverse()反转链表:

c1.reverse(); //c1(30,20,10)

22.    size()返回链表中元素个数

list<int>::size_type i=c1.size();  //i=3

23.    sort()对链表排序,默认升序(可自定义)

c1.sort();  //c1(10,20,30)

c1.sort(great<int>()); //c1(30,20,10)

24.    splice()对两个链表进行结合(三个重载)

c1.splice(++c1.begin(),c2); 

//c1(10,40,50,60,20,30) c2为空 全合并

c1.splice(++c1.begin(),c2,++c2.begin());

//c1(10,50,20,30) ; c2(40,60) 指定元素合并

c1.splice(++c1.begin(),c2,++c2.begin(),c2.end());

//c1(10,50,60,20,30); c2(40) 指定范围合并

25.    swap()交换两个链表(两个重载)

c1.swap(c2);  //c1(40,50,60);

swap(c1,c2);  //c1(40,50,60)

26.    unique()删除相邻重复元素(断言已经排序,因为它不会删除不相邻的相同元素)

c1.unique(); 

//假设c1开始(-10,10,10,20,20,-10)则之后为c1(-10,10,20,-10)

c1.unique(mypred); //自定义谓词

【STL】模拟实现list 因为迭代器·结点指针的行为不能满足迭代器定义,那么我们可以对这个结点指针进行封装,对结点指针的各种运算符进行重载,使得我们可以像使用string和vector当中的迭代器一样去使用list当中的迭代器。当我们使用解引用操作符时,是想得到该位置的数据内容,所以我们直接返回当前结点指针所指向的数据即可,但是这里需要解引用返回,得到数据之后,我们后面可能会对这个数据进行修改。对于后置--,我们需要记录结点指针当前的位置,让结点指针向指向前一个结点,然后返回自减前的结点指针即可。 阅读详情

相关推荐

【C++】STL——list(万字详解

list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2401_87556590的博客 1281

STL算法集合

// 简单查找算法,要求输入迭代器(input iterator) find(beg, end, val); // 返回一个迭代器,指向输入序列中第一个等于 val 的元素,未找到返回 end find_if(beg, end, unaryPred); // 返回一个迭代器,指向第一个满足 unaryPred 的元素,未找到返回 end find_if_not(beg, end, unaryPre...

qq_23350817的博客 424

《MySQL高级篇》十四、多版本并发控制

《MySQL高级篇》十四、多版本并发控制

LXYDSF的博客 3992

STL之四:list用法详解

list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。 常用函数 (1)    构造函数 list c:创建一个空的list list c1(c2):复制另一个同类型元素的list

longshengguoji的专栏 2万+

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5612

小红书x-mini签名逆向实战:Frida动态Hook与算法还原

在移动App协议分析中,请求签名机制是保障接口安全的核心技术,其本质是客户端对请求参数、时间戳、设备指纹等要素进行加密认证的过程。理解签名原理需掌握Native层加密流程、JNI调用机制及密钥动态派生逻辑。Frida作为主流动态插桩工具,能绕过符号剥离、字符串加密和控制流混淆等反分析手段,在函数执行瞬间捕获寄存器状态、内存数据与调用上下文,实现签名算法的完整还原。该技术广泛应用于合规内容监测、API自动化调用与竞品协议研究等工程场景。本文聚焦小红书x-mini签名这一典型样本,详解从JNI_OnLoad定位

weixin_31264565的博客 461

【STL】list的使用

list是STL中又一重要容器,而 list 其实就是对链表的封装,一起来看看list是如何使用的?库中又有什么有趣的函数吧✨✨

Lin_Alpaca的博客 1969

中兴B860AV2.1-A刷机避坑指南:晶晨免拆神器+安卓7.1.2固件实测

本文提供中兴B860AV2.1-A机顶盒的详细刷机教程,重点介绍使用晶晨免拆神器配合安卓7.1.2线刷固件包的实操步骤。内容涵盖刷机前的硬件确认、工具准备、软件设置、烧录全过程监控及常见问题解决,旨在帮助用户安全、高效地完成刷机,规避变砖风险,释放设备潜力。

pytorch8learner的博客 749

【c++丨STL】list的使用

之前我们已经学习了string、vector两个容器的使用方法及模拟实现,今天跟大家介绍list的使用方法。在STL中,尽管容器各异,但同名接口的功能往往是相似的。因此,在我们掌握了少数几个容器的使用方法后,对于未曾接触过的其他容器,只要了解其底层数据结构,就基本能够上手使用它们。list是STL中的一种容器,用于表示链表结构,底层实现是一个双向带头循环链表。

2301_80955819的博客 2184

LangChain入门(二)-通过 Google 搜索并返回答案

并复制他给我们生成 api key。(博主使用了GitHub账号登录)-邮箱验证-手机号验证-订阅-api-key。Serpapi 提供了 google 搜索的 api 接口。首先需要我们到 Serpapi 官网上注册一个用户,

Good Luck 1万+

numeca linux 11,NUMECA FINE/Turbo16下载-NUMECA FINE/Turbo16官方版v16.0 最新版 - 起点软件园...

NUMECA FINE/Turbo16,空气动力学模拟工具,帮助小伙伴随时仿真模拟,让小伙伴可以模拟出最真实的环境,让小伙伴可以轻松完成环境模拟的服务,帮助小伙伴更好的解决自己的课题研究!NUMECA FINE/Turbo16说明1、支持在64位WINDOWS操作系统和LINUX操作系统下运行2、基于全二阶精度的数值格式,保证了计算精度3、采用先进的全多重网格技术和基于密度的求解方法保证了快速的流...

weixin_39858298的博客 1624

STL中的List

List即链表常见的链表有多种形式,以为区分,共有8种不带头不循环不带头循环不带头不循环不带头循环带头不循环带头循环带头不循环带头循环而STL中的list就是。

2302_81258662的博客 2817

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 185

【C++】STL中list的使用

在C++中,list是一个双向链表容器(带头双向链表如下所示)。它是C++标准库中的一种容器类型,可以用来存储和管理数据。list的特点是可以高效地执行插入和删除操作,但是在访问和搜索元素方面相对较慢。list的元素类型可以是任意类型,包括基本数据类型和自定义的对象类型。list容器提供了一系列的成员函数和操作符,可以用于在链表中插入、删除和访问元素,以及对链表进行遍历和操作。通过使用list容器,可以方便地实现一些功能,如实现队列或栈、排序和合并链表等。由于其特殊的数据结构,list。

m0_64826370的博客 1619

yolo 图像检测、关键点检测单摄像头测量物体尺寸长度大小

new_distance/real_size (待求物体像素距离与实际距离比值)= distance / metric_length (参照物像素距离与实际距离比值)然后运行size_demo进行要测量的物体进行关节点检测距离;metric_length是上面耳机选取的两个点的实际物理距离,大概6cm;这里用的windows。通过关键点检测识别物体关键点的像素距离,然后参考比例尺计算实际距离。2)关键点算法这里用的现有的进行测试,实际场景需要自己训练。这里拿这模型推理出的关键点坐标进行后续长度计算。

weixin_42357472的博客 2526

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【C++】STL·List

本文介绍了C++ STL中list容器的使用与模拟实现。主要内容包括:1)list的基本用法,如构造、迭代器操作、容量查询、元素访问及修改操作;2)重点分析了list迭代器失效问题,指出删除操作会导致被删节点的迭代器失效;3)详细展示了list的模拟实现过程,包括节点结构、迭代器封装及核心接口实现;4)对比了vector和list的底层结构及特性差异,指出vector适合随机访问场景,而list更适合频繁插入删除的操作。文章通过代码示例深入解析了list的内部实现机制和使用注意事项。

2401_89058999的博客 1010

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++ -- STL【list的使用】

本文介绍了C++中两种链表容器forward_list和list的主要特性及使用方法。详细讲解了list的初始化、迭代器使用、容量操作、元素访问和修改等常用接口,特别强调了list不支持随机访问,必须使用其内置的sort方法而非算法库的sort。通过多个代码示例展示了各种接口的具体用法,帮助开发者根据实际需求在内存效率和功能灵活性之间做出选择。

2301_80059080的博客 1166

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++ [STL之list的使用]

vector是一片连续的空间,在数据访问上性能较好,但是任意位置插入删除性能较低,头插头删性能亦是如此;此时在这种需要频繁插入的场景下,显然链表是一种更好的选择,STL中实现了带头双选循环链表,本次我们来介绍该如何使用STL中的链表list!list的使用介绍到这里就结束了,相信学会了list在需要频繁增删数据的场景下我们那个轻松应对,对于vector和list两者各有优劣,应对不同的场景我们需要合理应用甚至结合使用!

ARMCSKGT的博客 9276

C++STL之list

是 C++ STL 中的双向链表容器,底层实现为。支持快速插入和删除(O(1)时间复杂度),不支持随机访问(不能使用下标操作),插入和删除操作不会使迭代器失效(除了被删除元素的迭代器)与 vector 和 deque 相比,list 在任意位置的插入删除性能更优,但随机访问性能较差。

2301_79969685的博客 1125

STL——list

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

wangdongdong23的博客 1927

C++ STL之list的使用

本文系统介绍了C++标准库中的list容器,主要包含以下内容:1. list的基本特性:作为双向链表实现的序列容器,支持高效任意位置插入删除操作,但不支持随机访问;2. 常用操作:详细讲解了构造函数、遍历方式(size/iterator/range-for)、元素操作(push/pop/insert/erase/clear/swap)等核心功能;3. 特殊算法:包括sort、unique、remove等专用成员函数的使用方法及效率特点;4. 迭代器特性:分析了list迭代器失效问题,并与vector进行对比

2401_88465894的博客 1443

【C++】STL——list

list。

m0_74091744的博客 1478

C++学习之STL学习:list的使用

测试://在list尾部添加元素//在list头部添加元素。

2401_89119815的博客 1053

C++STL系列之list

list的迭代器需要掌握,后面的map和set还会用到类似的思想。还需要掌握vector和list的区别,可以从底层,随机访问,插入删除,空间,迭代器等场景来做对比。

weixin_62188419的博客 1203

【STL】list

list 是 C++ 标准模板库(STL)中的一个序列容器(Sequence Container),它允许在容器的任意位置快速插入和删除元素,是一个能够存储任意类型的双向带头循环链表。

jmlangel_的博客 1505
上一篇: XMPP协议简介-什么是XMPP协议?
下一篇: Mac 显示隐藏文件的方法
nitghost
博客等级 码龄19年 32粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值