跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > 【C++】list介绍

【C++】list介绍

时间:2024-04-11 18:20:27 来源:网络cs 作者:往北 栏目:卖家故事 阅读:

标签:
阅读本书更多章节>>>>

个人主页 : zxctscl
如有转载请先通知

文章目录

1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice

1. list介绍

在这里插入图片描述

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)
在这里插入图片描述

list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。

2. list的构造

在这里插入图片描述

3. ist iterator的使用

此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。
在这里插入图片描述
在这里插入图片描述
直接看代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);list<int>::iterator it = lt.begin();while (it != lt.end()){cout << *it << " ";it++;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

注意:

begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

4. capacity

在这里插入图片描述

5. element access

在这里插入图片描述

6. modifiers

在这里插入图片描述

7. 迭代器失效

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

list的insert不会失效,但是erase会失效。
在这里插入图片描述

void TestListIterator1(){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()){l.erase(it);++it;}}

erase()函数执行后,it所指向的节点已被删除,因此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()){l.erase(it++); // it = l.erase(it);}}

在这里插入图片描述

8. Operations

在这里插入图片描述

8.1 reverse

reverse逆置
来看看代码;

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.2 sort

在这里插入图片描述
sort默认排的是升序,来看看代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.reverse();for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
在这里插入图片描述
排降序的话,得加一个仿函数

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort(greater<int>());for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.3 unique

去重要求先排序在这里插入图片描述
来看看代码:

list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(2);lt.push_back(2);lt.push_back(4);lt.push_back(5);lt.push_back(2);for (auto e : lt){cout << e << " ";}cout << endl;lt.sort();for (auto e : lt){cout << e << " ";}cout << endl;lt.unique();for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述

8.4 splice

splice是转移的意思,但是转移的链表类型必须是相同的。
在这里插入图片描述
举个例子:把第一个位置的值拿出来,也就是1.然后2 3 4依此往前挪,最后插入到最后面。只是改变节点的指向。
在这里插入图片描述

代码:

    list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;lt.splice(lt.end(), lt, lt.begin());for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
在这里插入图片描述
也可以把一个链表的一部分转移到另一个节点上,
看代码:

list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;list<int> lt1;lt.push_back(10);lt.push_back(20);lt.push_back(30);lt.push_back(40);lt.splice(lt.begin(), lt1);for (auto e : lt){cout << e << " ";}cout << endl;

在这里插入图片描述
有问题请指出,大家一起进步!!!

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-11/157221.html,文章来源:网络cs,作者:往北,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论