【C++入门到精通】C++入门 —— list (STL)


阅读导航

  • 前言
  • 一、list简介
    • 1.概念
    • 2.特点
  • 二、list的使用
    • 1.list的构造
    • 2.常见的操作
      • ⭕std::list类型的增、删、查、改
  • 三、list与vector的对比
  • 温馨提示

前言

文章绑定了VS平台下std::list的源码,大家可以下载了解一下😍

前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,以及学习了几个STL的结构也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点—— list(STL)。下面话不多说坐稳扶好咱们要开车了😍

一、list简介

1.概念

std::list是C++标准库中的双向链表容器。(这里有官方介绍链接) 它支持在任意位置进行快速插入和删除操作,并且在需要对元素进行频繁的插入和删除操作时,通常比std::vector更高效。std::list的元素不是在连续内存中存储,而是通过指针相互连接在一起。
list的模型化图像

2.特点

  1. 双向访问:std::list的元素可以通过双向迭代器从前向后或者从后向前进行访问。

  2. 插入和删除操作高效:由于std::list的元素是通过指针连接在一起的,插入和删除操作只需要修改相邻元素的指针,因此在任意位置进行插入和删除操作的时间复杂度是O(1)。

  3. 不支持随机访问:由于std::list的元素不是在连续内存中存储的,因此不能通过下标来随机访问元素。如果需要随机访问元素,可以考虑使用std::vector或者std::array。

  4. 内存占用相对较大:由于每个元素都需要额外的指针来连接其他元素,std::list的内存占用相对较大。

二、list的使用

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

1.list的构造

std::list类提供了多个构造函数,用于创建和初始化std::list对象。官方链接点这里跳转 下面是常用的构造函数列表:

  1. 默认构造函数:

    std::list<T> myList;
    

    创建一个空的std::list对象,其中T是元素的类型。

  2. 带有容量参数的构造函数:

    std::list<T> myList(size, value);
    

    创建一个包含size个元素的std::list对象,每个元素的值都是value。

  3. 区间构造函数:

    std::list<T> myList(first, last);
    

    创建一个std::list对象,其中包含[first, last)区间的元素。first和last是输入迭代器,用于指定要拷贝到新std::list中的元素范围。

  4. 拷贝构造函数:

    std::list<T> myList(otherList);
    

    创建一个std::list对象,其中包含与otherList相同的元素。这将执行深拷贝,即将otherList中的元素复制到新的std::list对象中。

  5. 移动构造函数:

    std::list<T> myList(std::move(otherList));
    

    创建一个std::list对象,并从其他std::list对象otherList中移动元素到新的std::list对象中。在移动构造函数后,otherList将为空。

注意:上述构造函数中的T表示元素的类型,可以是任何有效的C++类型

#include <list>int main() {// 默认构造函数std::list<int> myList;// 带有容量参数的构造函数std::list<int> myList2(5, 10); // 包含5个值为10的元素// 区间构造函数int arr[] = {1, 2, 3, 4, 5};std::list<int> myList3(std::begin(arr), std::end(arr)); // 包含数组arr的元素// 拷贝构造函数std::list<int> myList4(myList2);// 移动构造函数std::list<int> myList5(std::move(myList4)); // myList4将为空return 0;
}

这些是std::list常用的构造函数示例。你可以根据自己的需求选择适当的构造函数来创建std::list对象。

2.常见的操作

⭕std::list类型的增、删、查、改

  1. 插入元素:

    • push_back(value):在列表的末尾插入一个元素。
    • push_front(value):在列表的开头插入一个元素。
    • insert(pos, value):在指定位置pos之前插入一个元素。
  2. 删除元素:

    • pop_back():删除列表末尾的元素。
    • pop_front():删除列表开头的元素。
    • erase(pos):删除指定位置pos处的元素。
    • erase(first, last):删除从[first, last)范围内的所有元素。
  3. 访问元素:

    • front():返回列表的第一个元素的引用。
    • back():返回列表的最后一个元素的引用。
  4. 迭代器操作:

    • begin():返回指向列表第一个元素的迭代器。
    • end():返回指向最后一个元素之后位置的迭代器。
    • rbegin():返回指向列表最后一个元素的逆向迭代器。
    • rend():返回指向第一个元素之前位置的逆向迭代器。
  5. 大小和清空操作:

    • size():返回列表中元素的数量。
    • empty():检查列表是否为空。
    • clear():清除列表中的所有元素。
  6. 修改元素:

    • assign(first, last):用[first, last)范围内的元素替换列表的内容。
    • assign(n, value):用n个值为value的元素替换列表的内容。
    • resize(count):改变列表的大小,使其包含count个元素,并根据需要插入或删除元素。
    • swap(otherList):交换当前列表与otherList之间的内容。
  7. 查找和排序:

    • find(value):返回指向第一个值为value的元素的迭代器;如果找不到,则返回end()。
    • sort():按升序对列表中的元素进行排序。
    • reverse():反转列表中的元素的顺序。

以上只是std::list的一些常见操作,还有很多其他的成员函数可用于更复杂的操作。这里有官方的链接你可以根据具体的需求选择适当的操作。

以下是一些示例,展示了std::list的常见操作:

#include <list>
#include <iostream>int main() {std::list<int> myList;// 插入元素myList.push_back(1);myList.push_front(2);myList.insert(std::next(myList.begin()), 3);// 删除元素myList.pop_back();myList.pop_front();myList.erase(std::next(myList.begin()));// 访问元素std::cout << "Front element: " << myList.front() << std::endl;std::cout << "Back element: " << myList.back() << std::endl;// 迭代器操作for (auto it = myList.begin(); it != myList.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;// 大小和清空操作std::cout << "Size: " << myList.size() << std::endl;std::cout << "Empty: " << (myList.empty() ? "Yes" : "No") << std::endl;myList.clear();// 查找和排序myList.push_back(5);myList.push_back(2);myList.push_back(4);myList.push_back(1);auto it = myList.find(4);ifit != myList.end()) {std::cout << "Found value 4" << std::endl;}myList.sort();std::cout << "Sorted list: ";for (const auto& element : myList) {std::cout << element << " ";}std::cout << std::endl;return 0;
}

三、list与vector的对比

  1. 数据存储方式:

    • vector:使用连续的内存块存储,可以在O(1)时间内访问任意位置的元素。
    • list:使用双向链表存储,每个节点存储一个元素,在O(n)时间内访问任意位置的元素。
  2. 动态性:

    • vector:动态数组,长度可变。能够动态增长和收缩,但在插入和删除操作时可能需要重新分配内存,导致数据的搬移。
    • list:由于使用链表存储,插入和删除操作相对快速,不会涉及内存的重新分配和数据的搬移。
  3. 访问效率:

    • vector:由于数据存储在连续的内存块中,可以通过下标访问元素,提供了O(1)的随机访问效率。
    • list:需要遍历链表才能访问到指定位置的元素,访问效率为O(n)。
  4. 插入和删除操作:

    • vector:在尾部进行插入和删除操作效率高,复杂度为O(1);在中间或头部进行插入和删除操作会导致后续元素的移动,复杂度为O(n)。
    • list:在插入和删除操作时,只需修改相邻节点的指针,复杂度为O(1),对于任意位置的插入和删除都具有较高效率。
  5. 内存使用:

    • vector:由于数据存储在连续的内存块,相对于list可能产生更少的内存开销。
    • list:由于每个元素需要额外的指针进行连接,相对于vector可能产生更多的内存开销。

综上所述,当需要频繁进行随机访问操作或者需要动态增长和收缩容量时,vector是一个更好的选择。而在需要频繁进行插入和删除操作、对访问效率要求不高或者需要避免数据搬移时,list是一个更合适的选择。

温馨提示

感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/41705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言实例_获取文件MD5值

一、MD5介绍 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数算法。将任意长度的数据作为输入&#xff0c;并生成一个唯一的、固定长度&#xff08;通常是128位&#xff09;的哈希值&#xff0c;称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名…

全球磁强计市场价值约为16.2亿美元,预测期内将以超过5.21%的增长率增长

磁强计是一种用于测量磁场强度和方向的仪器。它可以检测和测量地球磁场、物体的磁性、地下矿藏、磁性材料等。磁强计在地球科学、物理学、地质学、勘探、矿业等领域具有广泛的应用。 根据阿谱尔&#xff08;APO&#xff09;的统计及预测&#xff0c;2022年全球磁强计市场价值约…

ts与vue

ts与Vue 如果你已经学习了typeScript,但不知道如何在vue项目中使用&#xff0c;那么这篇文章将会很适合你。参考千峰教育 kerwin视频 1.会自动推导&#xff0c;隐士推导。提示 类型系统。 独立模块。 isolatedModules选项&#xff1a;是否配置为独立的模块。 减少报错 let …

dispatcherServlet在tomcat启动时如何被加载(1)

目录 在springboot工程中, 如何添加一个servlet呢? 方法1 : 使用WebServlet注解 方法2 : 使用ServletRegistrationBean进行注册 springmvc 采用的就是方式2和springboot集成的, 看一下源码 springboot 字段装配里面有这个类, 看一下源码 90行, 创建了一个DispatcherServlet对象…

解决Adobe Flash Player已被屏蔽

问题&#xff1a;该插件不支持 原因&#xff1a;现在浏览器默认禁用flash 博主当前使用的是谷歌浏览器Chrome 2个主要方法都已经失效 搜索一圈后&#xff0c;之前博客给出的2个主要方法都已经失效。 1、flash.cn 下载本地播放器 2、在chrome中打开flash的禁用开关 2023年解…

LangChain源码逐行解密之系统(二)

LangChain源码逐行解密之系统 20.2 serapi.py源码逐行剖析 我们可以看一下Google查询的例子,在LangChain中有多种实现的方式。 如图20-5所示,在utilities的serpapi.py代码文件中实现了SerpAPIWrapper。 图20- 5 utilities的serpapi.py的SerpAPIWrapper 在langchain目录的se…

如何避免爬虫IP被屏蔽

各位爬友们好&#xff0c;作为一名专业的爬虫代理提供者&#xff0c;我要和大家分享一些避免爬虫IP被屏蔽的实用技巧。你知道吗&#xff0c;当我们爬取数据的时候&#xff0c;很容易被目标网站识别出来并封禁我们的IP地址&#xff0c;导致无法继续爬取数据。这个问题困扰了很多…

7. 实现 API 自动生成

目录 1. pom.xml中引用依赖 2. 引入相关的依赖 3. 编写配置类 4. application.yml 中添加配置 5. API 常用注解 6. 访问 API 列表 7. API 导入 Postman 使用 Springfox Swagger生成 API&#xff0c;并导入 Postman&#xff0c;完成API单元测试。 Swagger 简介&#xff1a;Swag…

执行Lua脚本后一直查询不到Redis中的数据(附带问题详细排查过程,一波三折)

文章目录 执行Lua脚本后一直查询不到Redis中的数据&#xff08;附带详细问题排查过程&#xff0c;一波三折&#xff09;问题背景问题1&#xff1a;Lua脚本无法切库问题2&#xff1a;RedisTemlate切库报错问题3&#xff1a;序列化导致数据不一致问题4&#xff1a;Lua脚本中单引号…

Flask Web开发实战(狼书)| 笔记第1、2章

前言 2023-8-11 以前对网站开发萌生了想法&#xff0c;又有些急于求成&#xff0c;在B站照着视频敲了一个基于flask的博客系统。但对于程序的代码难免有些囫囵吞枣&#xff0c;存在许多模糊或不太理解的地方&#xff0c;只会照葫芦画瓢。 而当自己想开发一个什么网站的时&…

ubuntu部署haproxy

HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理. 1、更新系统报 通过在终端中运行以下命令&#xff0c;确保所有系统包都是最新的 sudo apt updatesudo apt upgrade2、安装Haproxy sudo apt install haproxy设置开机自动启动haproxy服务 sudo systemctl en…

Lnton羚通关于如何解决nanoPC-T4 upgrade报错问题?

nanoPC-T4 在 ​​# sudo apt update 和 sudo apt upgrade​​升级或安装软件 ​​sudo apt install xxx​​时遇到以下问题&#xff1a;​​Failed to set up interface with /etc/hostapd/​ Setting up hostapd (2:2.6-15ubuntu2.8) ... Job for hostapd.service failed be…

ssm+vue医院住院管理系统源码和论文PPT

ssmvue医院住院管理系统源码和论文PPT012 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生…

基于IMX6ULLmini的linux裸机开发系列一:汇编点亮LED

思来想去还是决定记录一下点灯&#xff0c;毕竟万物皆点灯嘛 编程步骤 使能GPIO时钟 设置引脚复用为GPIO 设置引脚属性(上下拉、速率、驱动能力) 控制GPIO引脚输出高低电平 使能GPIO时钟 其实和32差不多 先找到控制LED灯的引脚&#xff0c;也就是原理图 文件名 C:/Us…

AUTOSAR NvM Block的三种类型

Native NVRAM block Native block是最基础的NvM Block&#xff0c;可以用来存储一个数据&#xff0c;可以配置长度、CRC等。 Redundant NVRAM block Redundant block就是在Native block的基础上再加一个冗余块&#xff0c;当Native block失效&#xff08;读取失败或CRC校验失…

剑指offer44.数字序列中某一位的数字

最后一道题&#xff0c;我一定要自己做出来&#xff0c;想了不到一个小时想法差不多成熟了&#xff0c;但是有一个小细节出问题了&#xff0c;这个问题我在idea上debug都没debug出来。我先讲我的题解然后再讲我这个小问题出在哪里吧。以下是我的代码&#xff1a; class Soluti…

PHP手术麻醉系统源码,自动生成麻醉和护理医疗文书

一套手术麻醉系统源码&#xff0c;可二次开发 手术室麻醉临床信息系统&#xff08;AIMS&#xff09;是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人进行全程跟踪与信息管理&#xff0c;自动集成病人HIS、LIS、RIS、PACS信息&#xff0…

【Spring源码】小白速通解析Spring源码,从0到1,持续更新!

Spring源码 参考资料 https://www.bilibili.com/video/BV1Tz4y1a7FM https://www.bilibili.com/video/BV1iz4y1b75q bean工厂 DefaultListableBeanFactory&#xff08;最原始&#xff09; bean的生命周期 创建&#xff08;实例化&#xff09;–>依赖注入–>-初始化…

数据生成 | MATLAB实现WGAN生成对抗网络数据生成

数据生成 | MATLAB实现WGAN生成对抗网络数据生成 目录 数据生成 | MATLAB实现WGAN生成对抗网络数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 1.WGAN生成对抗网络&#xff0c;数据生成&#xff0c;样本生成程序&#xff0c;MATLAB程序&#xff1b; 2.适用于MATL…

【游戏评测】河洛群侠传一周目玩后感

总游戏时长接近100小时&#xff0c;刚好一个月。 这两天费了点劲做了些成就&#xff0c;刷了等级&#xff0c;把最终决战做了。 总体感觉还是不错的。游戏是开放世界3D游戏&#xff0c;Unity引擎&#xff0c;瑕疵很多&#xff0c;但胜在剧情扎实&#xff0c;天赋系统、秘籍功法…