当前位置: 首页 > news >正文

小解List的使用【C++】

小解List的使用【C++】

  • 一. List
    • 1.1. 与vector的不同
    • 1.2 与vector的使用不同
      • 1.2.1 迭代器失效
      • 1.2.2. insert
      • 1.2.3 erase
      • 1.2.4 sort
      • 1.3. 其他接口
  • 补充迭代器
    • 容器与迭代器的关系
    • 迭代器的类型

一. List

学习了STL,也已经到了List的内容
因为List与string以及vector比起来还是有很大不同的,所以这里稍微除了一篇小博客主要来讲解一下
相对于vector以及string,List中比较特殊的部分。

1.1. 与vector的不同

我们再学习这个List之前:
大部分人应该都已经知道list的底层实际上是:双向带头循环链表
这个其实以前博主再博客中实现过。

这里也不深究

string和vector实际上本质是顺序表

这两个类型的最大区别就是:
vector在内存中相当于动态开辟的数组,地址是连续的

链表中的节点则不是连续的,在内存中表现的是断开的,不连续的形式

所以vector的区别和使用上的区别也都是围绕着这个展开的。

与string有较大的不一样,因为空间不连续

1.2 与vector的使用不同

这里主要挑出来几个常用的功能
来体验一下vector与list的区别。

1.2.1 迭代器失效

还记得在vector中的迭代器失效吗

就是当使用迭代器进行insert和erase后,
重新使用迭代器对象进行操作
因为迭代器指向的位置虽然没变,但是指向的值却已经发生了变化。
在vs编译器下,直接限制了用户对erase与insert后的指针对象的使用。

#include<iostream>
#include<vector>
#include"vector.h"
int main()
{std::vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);std::vector<int>::iterator begin = v1.begin();v1.erase(begin);while (begin != v1.end()){std::cout << *begin;begin++;}
}

就是上面的情况。

但是我们把目光转向list,看看list中是否存在迭代器失效的结果。

1.2.2. insert

这里我们直接进行测试把

int main()
{vector<int> v1;vector<int>::iterator it = v1.begin();v1.insert(it, 1);v1.insert(it, 2);
}

这里先用vector进行测试
很明显是行不通的,因为it被连续调用了两次。

在这里插入图片描述

这里就用list进行测试:
在这里插入图片描述

在这里插入图片描述

这里能发现并没有报错。

这里其实我们细想一下也能明白

list使用insert时候
list中的地址指向的值没有发生变化
因为他们本身就是不连续的,数据插入后,他们指针指向的位置依旧还是原来的值。

所以不会出现和vector一样的情况——移动后,前面的元素,会取代原来的值所以指针指向的值就发生了变化。

所以用insert不会发生迭代器失效的问题。

这里又要提出一个小问题:
因为vector的地址是连续的,在insert中可以直接用:

v1.insert(it+5,2);

表示在迭代器的+5的位置处进行插入

这里vector能这么用,是因为vector的迭代器能支持加减,因为vector的地址是连续的

但是list的话因为地址不一样,所以是不是可能就不行了。

这里我们来试一下
在这里插入图片描述

这里就非常明显的报错了。

所以我们list想在迭代器后面进行插入就要自己让迭代器去++;

比如这里:
想要到迭代器后的第三个位置进行插入

std::list<int>::iterator it=s1.begin();
for(int i=0;i<3;i++)
{it++;
}

1.2.3 erase

其实erase这里不用实验。想想就能知道了

erase的作用是删除节点。
那节点都删除了,迭代器指向的指针位置肯定也消失了。
所以这里就不实验了,毫无疑问。

那问题应该是怎么解决:
其实这里和vector里的一样:
it=it.erase();

it会自带返回迭代器
返回的指向对象正是迭代器删除的对象的下一个指向对象。

1.2.4 sort

我们知道在算法中有一个qsort算法。

但是在list中,list自带了一个qsort接口,方便用户进行排序。

但是这里我们并不提倡用这个qsort

因为:
sort():
算法中的sort效率远高于list的sort效率
数据量差的越多,效率差距越大

因为算法中的sort用的是快速排序

而因为list中的地址不是连续的,所以并不能用快速排序,只能用归并排序进行实现

这里我们能来进行测试以下:

这里把测试函数塞进来:

void test2()
{int N = 1000000;//测试的数字的多少std::vector<int>v1;//添加随机值给vectorfor (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}//给list添加随机值std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}//排序list并记录时间int begin1 = clock();l1.sort();int end1 = clock();//排序vector并记录时间int begin2 = clock();sort(v1.begin(), v1.end());int end2 = clock();std::cout << "vector " << end2 - begin2 << std::endl;std::cout << "list " << end1 - begin1 << std::endl;
}

在这里插入图片描述
这里我们能看到list和vector的效率差距还是十分大的。

所以还是不推荐用list的sort的

那我们想要排序list中的数怎么办。

我们可以将list中的数字拷贝进vector中,然后再vector排序完了后,赋值给list

void test3()
{int N = 1000000;std::vector<int>v1;for (int i = 0; i < N; i++){auto s = rand();v1.push_back(s);}std::list<int> l1;for (int i = 0; i < N; i++){auto s = rand();l1.push_back(s);}int begin1 = clock();sort(v1.begin(), v1.end());int end1 = clock();int begin2 = clock();std::vector<int>v2;for (auto i : l1){v2.push_back(i);}sort(v2.begin(), v2.end());size_t i = 0;//将vector赋值给listfor (auto& z : l1){z = v2[i++];}int end2 = clock();std::list<int> l2;for (int i = 0; i < N; i++){auto s = rand();l2.push_back(s);}int begin3 = clock();l2.sort();int end3 = clock();std::cout << "vector " << end1 - begin1 << std::endl;std::cout << "list_good " << end2 - begin2 << std::endl;std::cout << "list " << end3 - begin3 << std::endl;}

1.3. 其他接口

这里的其他接口就不进行演示了
这里贴个网址自己去使用即可:
List的其他接口

补充迭代器

这里因为vector与list有许多的不同。

所以他们的迭代器有很大的不同,这里就补充一下迭代器。

容器与迭代器的关系

我们都知道:

容器使用来存储数据的

算法是用来处理数据的。

而迭代器是用来链接容器和算法之间的桥梁。

有了迭代器,算法就可以通过访问迭代器改变容器中的数据。

所以对于迭代器来说要通过容器的性质来进行设计。
容器的不同会导致迭代器的类型也不同

迭代器的类型

在这里插入图片描述

这里的容器种类不同,迭代器的种类也不同。

迭代器的种类不同,我们能看到他们支持的运算符种类也不同。

相关文章:

小解List的使用【C++】

小解List的使用【C】 一. List1.1. 与vector的不同1.2 与vector的使用不同1.2.1 迭代器失效1.2.2. insert1.2.3 erase1.2.4 sort1.3. 其他接口 补充迭代器容器与迭代器的关系迭代器的类型 一. List 学习了STL&#xff0c;也已经到了List的内容 因为List与string以及vector比起…...

自动驾驶高效预训练--降低落地成本的新思路(AD-PT)

自动驾驶高效预训练--降低落地成本的新思路 1. 之前的方法2. 主要工作——面向自动驾驶的点云预训练2.1. 数据准备 出发点&#xff1a;通过预训练的方式&#xff0c;可以利用大量无标注数据进一步提升3D检测 https://arxiv.org/pdf/2306.00612.pdf 1. 之前的方法 1.基于对比学…...

Spring笔记(四)(黑马)(web层解决方案-SpringMVC)

01、Spring MVC 简介 1.1 SpringMVC概述 SpringMVC是一个基于Spring开发的MVC轻量级框架&#xff0c;Spring3.0后发布的组件&#xff0c;SpringMVC和Spring可以无 缝整合&#xff0c;使用DispatcherServlet作为前端控制器&#xff0c;且内部提供了处理器映射器、处理器适配器…...

企业如何实现高效运转?工单管理系统有什么特点和优势?

在当今这个数字化、信息化的时代&#xff0c;企业需要一个高效、智能的工具来优化和协调内部和外部的工作流程。工单管理系统正是这样一个不可或缺的软件工具&#xff0c;它能够自动化、智能化地处理工单&#xff0c;提高工作效率和客户满意度。本文将详细介绍工单管理系统的特…...

工业摄像机参数计算

在工业相机选型的时候有点懵&#xff0c;有一些参数都不知道咋计算的。有些概念也没有区分清楚。‘’ 靶面尺寸 CMOS 或者是 CCD 使用几分之几英寸来标注的时候&#xff0c;这个几分之几英寸计算的是什么尺寸&#xff1f; 一开始我以为这个计算的就是靶面的实际对角线的尺寸…...

Android系统中设置TextView的行间距

Android系统中TextView默认显示中文时会比较紧凑&#xff0c;不是很美观。 为了让每行保持一定的行间距&#xff0c;可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier。 1、设置行间距&#xff1a;android:lineSpacingExtra&#xff0c;取值范围&#xf…...

嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能

一百二十一、基于QT的OpenCV库实现人脸识别功能 121.1 UI 界面 登录按钮现在没啥实际作用&#xff0c;因为没加功能&#xff0c;可以添加在识别成功后运行的功能代码 121.2 思路 显示人脸&#xff1a; 通过 VideoCapture 这个类下面的 open() 方法打开摄像头&#xff0c;对…...

MySQL(12):MySQL数据类型

MySQL中的数据类型 常见数据类型的属性&#xff1a; 整数类型 整数类型一共有 5 种&#xff0c;包括 TINYINT、SMALLINT、MEDIUMINT、INT&#xff08;INTEGER&#xff09;和 BIGINT。 CREATE TABLE test_int1 ( X TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );…...

哪款手机便签软件支持存储录音文件并支持转文字?

手机便签类软件带有存储录音转文字功能是比较实用的&#xff0c;很多人通常会整理很多录音类型的文件&#xff0c;录音文件整合在一起后&#xff0c;后续有需要可以逐条点开播放收听。尤其是在工作中&#xff0c;当领导说一些重点时&#xff0c;大家无法借助灵活的大脑来成功的…...

Health Kit申请验证有问题?解决方案全解析

在接入Health Kit的过程中&#xff0c;应用上线前需要完成申请验证环节&#xff0c;获得正式的运动健康权限。 我们贴心整理了申请验证被驳回的高频问题&#xff0c;您可以在申请前阅读以下内容&#xff0c;避免在您的申请材料中出现下述问题影响审核通过的进度哦&#xff01;…...

2007-2022年上市公司工业机器人渗透度数据

2007-2022年上市公司工业机器人渗透度数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;股票代码、年份、工业机器人渗透度 3、计算方式&#xff1a;首先&#xff0c;计算行业层面的工业机器人渗透度指标&#xff1b;其次&#xff0c;构建企业层面的工业机器人渗透度…...

k8s基础环境部署

目录 跨主机免密认证 禁用selinux--所有主机操作 1.使用sed 2.直接更改配置文件 3.重启才能生效 禁用swap--所有主机操作 网络参数调整--所有主机 部署docker环境--所有主机 1.配置软件源 2.安装最新版docker 3.设置开机自启 4.配置docker加速器 5.重启服务 cri环境…...

家用工作站方案:ThinkBook 14 2023 版

本篇文章聊聊今年双十一&#xff0c;我新购置的家用工作站设备&#xff1a;ThinkBook 14 2023&#xff0c;一台五千元价位&#xff0c;没有显卡的笔记本。我为什么选择它&#xff0c;它又能做些什么。 写在前面 2021 年年中的时候&#xff0c;我写过一篇《廉价的家用工作站方…...

电脑篇——本地串口转TCP,TCP转虚拟串口,网络调试助手,串口调试助手

TCP/UDP工具、串口工具 https://pan.baidu.com/s/1SY03d_RRVhyOZfsPlApmxg?pwd5555 今日有个需求&#xff0c;就是在本机电脑上接了一个串口设备&#xff0c;然后我的QtCreator是在内网远程电脑运行的&#xff0c;我想将串口设备“挂载”到远程电脑上去调试程序&#xff0c;于…...

igbt好坏判断方法有哪些?万用表怎么测试igbt的好坏?

什么是IGBT? IGBT即绝缘栅双极型晶体管&#xff0c;是一种复合全控型电压驱动式功率半导体器件&#xff0c;是电力控制和电力转换的核心器件&#xff0c;在高电压和高电流的光伏逆变器、储能装置和新能源汽车等领域被广泛应用。IGBT具有高输入阻抗&#xff0c;低导通压降&…...

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局&#xff08;LinearLayout&#xff09; 2. 相对布局&#xff08;RelativeLayout&#xff09; 3. 表格布局&#xff08;TableLayout&#xff09; 4. 帧布局&#xff08;FrameLayout&#xff09; 5. 网格布局&#xff08;GridLayout&#xff0…...

2023-11-06 monetdb-事务-insert-delta缓存-分析

摘要: monetdb在事务处理时, 会将数据写入delta缓存中, 然后在commit时将数据写入wal文件, 随后由控制器决定何时将wal中的数据真正的写入BAT列文件中. 本文从delta缓存入手, 分析monetdb在事务处理中的细节. SQL: DML: create table t1 (a int); 事务DDL: START TRANSACTI…...

ubuntu 22.04 flameshot 截图异常的问题

方法找了好久&#xff0c;终于找到一个有用的 Firstly do not install flameshot from snapstore, install it using apt. Go to /etc/gdm3/custom.confRemove the comment on #WaylandEnablefalse Your custom.conf file should be like this: # GDM configuration storag…...

正点原子嵌入式linux驱动开发——Linux WIFI驱动

WIFI的使用已经很常见了&#xff0c;手机、平板、汽车等等&#xff0c;虽然可以使用有线网络&#xff0c;但是有时候很多设备存在布线困难的情况&#xff0c;此时WIFI就是一个不错的选择。正点原子STM32MP1开发板支持USB和SDIO这两种接口的WIFI&#xff0c;本章就来学习一下如何…...

React中的“状态”(state)和“属性”(props)的区别

在React中&#xff0c;"状态"&#xff08;state&#xff09;和"属性"&#xff08;props&#xff09;是两个重要的概念&#xff0c;它们在组件的生命周期和数据流中扮演着不同的角色。 状态&#xff08;State&#xff09;&#xff1a; 状态是React组件中用…...

从Opal到Pyrite:深入解析TCG存储安全标准的演进与选型

1. 从机械硬盘到自加密&#xff1a;存储安全的技术演进 记得十年前我第一次接触企业级数据安全时&#xff0c;大多数公司还在使用传统的机械硬盘配合软件加密方案。每次服务器重启都要等待漫长的解密过程&#xff0c;性能损耗高达30%以上。直到2012年第一次接触到支持TCG Opal标…...

DataV数据可视化组件库深度解析:专业级大屏开发实战指南

DataV数据可视化组件库深度解析&#xff1a;专业级大屏开发实战指南 【免费下载链接】DataV 项目地址: https://gitcode.com/gh_mirrors/datav/DataV DataV作为基于Vue技术栈的专业级数据可视化组件库&#xff0c;专为技术决策者和中级开发者设计&#xff0c;提供从SVG…...

labview框架下的产线MES系统:物料管理、排产计划与功能齐全的全方位管理

labview框架 产线MES系统 物料管理&#xff0c;排产计划&#xff0c;设备管理&#xff0c;报表管理&#xff0c;功能齐全 扫码追溯 PLC通信 数据库存储 标签打印最近在搞生产线自动化升级&#xff0c;发现用LabVIEW搭MES系统真香。这个可视化编程平台自带工业基因&#xff0c;处…...

微信聊天记录永久保存完整指南:如何用WeChatMsg守护你的数字记忆

微信聊天记录永久保存完整指南&#xff1a;如何用WeChatMsg守护你的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...

别再手动排班了!用 Vue 和 Element UI 封装一个可复用的日历排班组件(支持批量操作)

基于Vue与Element UI构建企业级可视化排班系统 在医疗、零售、客服等行业中&#xff0c;排班管理一直是困扰管理者的难题。传统表格形式的排班方式不仅操作繁琐&#xff0c;而且难以直观展示复杂的班次关系。本文将介绍如何利用Vue.js和Element UI组件库&#xff0c;从零开始构…...

颠覆性实时动漫超分技术:Anime4K深度解析与架构设计

颠覆性实时动漫超分技术&#xff1a;Anime4K深度解析与架构设计 【免费下载链接】Anime4K A High-Quality Real Time Upscaler for Anime Video 项目地址: https://gitcode.com/gh_mirrors/an/Anime4K Anime4K是一套开源的高质量实时动漫视频超分辨率与降噪算法&#xf…...

VPS的主要用途,与其它方式的区别

VPS的全称是虚拟专用服务器。它的核心原理是通过虚拟化技术&#xff0c;把一台物理服务器划分成多个相互独立的虚拟服务器。每个VPS都拥有自己独立的操作系统、CPU、内存、硬盘和网络资源&#xff0c;用户在使用时感觉就像在用一台真正的物理服务器。很多人会分不清VPS和虚拟主…...

AI Agent Harness Engineering 的安全性挑战:提示词注入与越狱

AI Agent Harness Engineering 的安全性挑战:提示词注入与越狱 3-5个标题备选 《从LangChain构建的AI Agent到企业内网泄密:提示词注入与越狱的完整攻防手册》 《AI Agent Harness实战避坑:5分钟带你理解为何90%的初级Agent存在致命安全漏洞》 《告别“裸奔”的AI助手:Pro…...

FPGA做FFT,选流水线还是突发I/O?Xilinx IP核四种架构的实战选择指南

FPGA中FFT IP核架构选型实战&#xff1a;从理论到决策的完整指南 在数字信号处理领域&#xff0c;快速傅里叶变换&#xff08;FFT&#xff09;作为频谱分析的核心算法&#xff0c;其硬件实现方式直接影响系统性能和资源利用率。Xilinx FPGA平台提供的四种FFT IP核架构——流水线…...

PHP V6 单商户常见问题——数据库模式修改 sql-mode

数据库模式修改 sql-mode问题现象很多小伙伴在本地部署后访问站点会报下图这种错误&#xff1a;数据获取失败:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column nc_saas.S…...