c++ -- STL容器--list容器

7. list容器

7.1 简介

① 功能:将数据进行链式存储。

② 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。

③ 链表的组成:链表由一系列结点组成。

④ 结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

⑤ 添加元素,将原指向下一个元素的指针指向新元素即可,新元素指向下一个元素

⑥ STL中的链表是一个双向循环链表。

  1. 双向:每一个指针既指向下一个结点的元素,也指向上一个结点的元素。

  1. 循环:最后一个结点的指针会指向第一个结点的元素,第一个结点的指针会指向最后一个结点的元素。

⑦ 由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器。

  1. 它只能通过指针域一个一个前移/后移去找,而不能连续的内存空间,指针加一个数字,就可以找到数据。

⑧ list的优点:

  1. 采用动态存储分配,不会造成内存浪费和溢出。

  1. 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量数据。

⑨ list的缺点:

  1. 链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大。

10.list有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector中是不成立的,vector当插入操作会创建一个更大的数据内容,而vector容器的迭代器却指向原有内存,所以原有的vector容器失效了。

11.STL中list和vector是两个最长被用的容器,各有优缺点。

7.2 构造函数

① 功能描述:创建list容器。

② 函数原型:

  1. list lst; //list采用模板类实现对象的默认构造形式

  1. list(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身。

  1. list(n,elem); //构造函数将n个elem拷贝给本身。

  1. list(const list &lst); //拷贝构造函数。

③ list构造方式同其他几个STL容器一样。

运行结果:

  • 10 20 30 40

  • 10 20 30 40

  • 10 20 30 40

  • 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000

  • 请按任意键继续. . .

7.3 赋值和交换

① 功能描述:给list容器进行赋值,以及交换list容器。

② 函数原型:

  1. assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身。

  1. assign(n,elem); //将n个elem拷贝赋值给本身。

  1. list& operator=(const list &list); //重载等号操作符。

  1. swap(list); //将lst与本身的元素互换。

运行结果:

  • 10 20 30 40

  • 10 20 30 40

  • 10 20 30 40

  • 100 100 100 100 100 100 100 100 100 100

  • 交换前:

  • 10 20 30 40

  • 100 100 100 100 100 100 100 100 100 100

  • 交换后:

  • 100 100 100 100 100 100 100 100 100 100

  • 10 20 30 40

  • 请按任意键继续. . .

7.4 大小操作

① 功能描述:对list容器的大小进行操作。

② 函数原型:

//返回容器中元素的个数。

  1. size();

//判断容器是否为空。

  1. empty();

//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(num);

//重新指定容器的长度为num,若容器变成,则以elem值填充新位置。

//如果容器变短,则末尾超出容器长度的元素被删除。

  1. resize(num,elem);

运行结果:

  • 10 20 30 40

  • L1不为空:

  • L1的元素个数为:4

  • 10 20 30 40 10000 10000 10000 10000 10000 10000

  • 10 20

  • 请按任意键继续. . .

7.5 插入和删除

① 功能描述:对list容器进行数据的插入和删除。

② 函数原型:

  1. push_back(elem); //在容器尾部加入一个元素。

  1. pop_back(); //删除容器中最后一个元素。

  1. push_front(elem); //在容器开头插入一个元素。

  1. pop_front(); //从哪个容器开头移除第一个元素

  1. insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置。

  1. insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。

  1. insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。

  1. clear(); //移除容器的所有数据。

  1. erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。

  1. erase(pos); //删除pos位置的数据,返回下一个数据的位置。

  1. remove(elem); //删除容器中所有与elem值匹配的元素。

运行结果:

  • 300 200 100 10 20 30

  • 300 200 100 10 20

  • 200 100 10 20

  • 200 1000 100 10 20

  • 1000 100 10 20

  • 1000 100 10 20 10000 10000 10000 10000

  • 1000 100 10 20

  • 请按任意键继续. . .

7.6 数据存取

① 功能描述:对list容器中数据进行存取。

② 函数原型:

  1. front(); //返回第一个元素。

  1. back(); //返回最后一个元素。

③ list容器不是连续的内存空间,所以不能通过[]、at等方式随机访问。

运行结果:

  • 第一个元素为:10

  • 第一个元素为:40

  • 请按任意键继续. . .

7.7 反转和排序

① 功能描述:将容器中的元素反转,以及将容器中的数据进行排序。

② 函数原型:

  1. reverse(); //反转链表

  1. sort(); //链表排序

运行结果:

  • 反转前:

  • 20 10 50 40 30

  • 反转后:

  • 30 40 50 10 20

  • 排序前:

  • 30 40 50 10 20

  • 排序后:

  • 10 20 30 40 50

  • 重载排序算法,降序排序后:

  • 50 40 30 20 10

  • 请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STL是指标准模板库(Standard Template Library),它是C++语言的一部分,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的目标是提供高效、可重用和可扩展的组件,以便开发人员能够更轻松地编写高质量的代码。STL包含了许多常见的数据结构,如vector、list、set、map等,以及各种算法,比如排序、查找、遍历等。通过使用STL,开发人员可以更加高效地处理各种数据结构和算法的问题,提高代码的开发效率和质量。 在STL中,我们可以使用各种容器来存储和管理数据。例如,我们可以使用std::map来创建一个键值对的映射,其中每个键都有一个与之相关联的值。下面是一个示例代码,展示了如何创建和使用一个std::map对象: std::map<std::string, int> disMap() { std::map<std::string, int> tempMap{ {"C语言教程",10},{"STL教程",20} }; return tempMap; } std::map<std::string, int> newMap(disMap()); 在这个示例中,disMap()函数创建了一个临时的std::map对象,并初始化了其中的一些键值对。然后,使用移动构造函数将这个临时对象移动到了一个新的std::map对象newMap中。最终,我们可以通过newMap对象来访问和操作这些键值对。 综上所述,STLC++中的标准模板库,提供了一系列的模板类和函数,用于支持通用的数据结构和算法。STL的使用可以提高代码的开发效率和质量,并且通过各种容器和算法,可以方便地处理各种数据结构和算法的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++ STL详解超全总结(快速入门STL)](https://blog.csdn.net/qq_50285142/article/details/114026148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【C++实验】阅读STL源码并分析](https://blog.csdn.net/qq_35760825/article/details/125311509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值