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

传统数组 vs vector和list

传统的数组:

int arr[10]; 传统的数组有以下的缺点:

1)长度不可修改

2)内存分配

局部数组:把数组定在函数内, 数组便是局部变量,故会被分配在栈上 但栈的大小是有限制的 ,故其在内存中不能超过1MB。 如果数组太大,可能会导致栈溢出。

int arr[1000000];  // 如果超出了内存限制,可能会失败

全局数组: 如果将数组声明为全局变量,数组会分配在数据段或 BSS 段中,不会受到栈大小的限制。但是,OJ(在线评测系统)通常对内存有严格的限制。如果数组过大,可能会超出内存限制,导致超时或内存不足的错误。

3)数组作为参数不方便。

在c语言中,将数组作为参数,实际上是传递数组的首地址,即传递的是指针,而不是整个数组。

故被调用函数只能得到数组的首地址,而无法得到数组的长度。

在做oj时要求用纯c解题,怎么解决上面的问题:

==》

1)一开始申请一个大的数组,如果局部数组的长度无法满足要求,就将数组定义为全局数组。若全局数组的占用内存超过了题目的内存限制。就是算法有问题。

我们也可以使用动态内存分配(malloc/realloc)来模拟动态数组,并手动管理内存。

2)在传参的时候传两个参数,数组的地址 和长度。

// 分配初始内存
int* arr = (int*)malloc(sizeof(int) * initial_size); //动态扩展数组
arr = (int*)realloc(arr, sizeof(int) * new_size); 
//传递数组的指针和长度
void func(int* arr, int size) {}
 

但若用c/c++,更好用的办法就是使用c++提供的vector,即动态数组。

vector的使用

都说:" 传统的静态数组 的大小在编译时就已经固定,无法在程序运行时修改。 而动态数组可以",对于这句话,通俗一点讲,就是说:

我们可以在写代码时不必定义其大小,即使定义了,我们也可以在后续的代码中使用各种方法插入或删除其元素,因为其在运行时会根据我们的代码操作自动调整其内存的 。

vector是c++提供的STL。他有一些优点;

1) 会自动处理内存分配和释放 , 免了 C 语言中常见的内存管理错误。

2) 通过 vector::size() 可以轻松获取数组的长度。

3)提供了丰富的成员函数

我们主要学习vector的增删查改。

引入

#include<vector>

增:

增操作包括初始化和插入;

1.初始化
vector<int> vec;
vector<double> vec;

注:vector不是类型,vector< type>才是类型,故下面的vec1和vec2不是同一种类型。

当然了也可以自定义一个类,从而可以定义vector<MyType>类型的变量;

struct MyType{
int val1;
double val2;
}
vector<MyType>vec;

另外,vector<int>也可以作为一种类型放在vector的<>中,

构成vector<vector<int>>,这种类型便是代表动态数组的动态数组,即二维数组。

vector<vector<int>>

在机试中,对于二维数组,推荐使用动态数组的静态数组,即下面这种写法;以应用于实现图算法中的邻接表。

vector<int> arr[10];
2.插入

插入数据使用push_back: 往动态数组的尾部插入;

我们知道,往顺序表中插入元素代价很大,而这种往数组末尾插入元素的操作非常高效,但若如果我们硬要往任意位置插入元素,该怎么办?

==》可以使用迭代器,我们稍后解答

int a;
while(scanf("%d",%a)!=EOF){vec.pushback(a);//往vec尾部插入a
}

查找

1、根据数组下标访问对应元素
//定义的这个数组下标从0到4
vector<int> vec={1,23,4};
int i=0;
printf(“vec[i]=%d\n",vec[i]);
2.遍历整个vector(for,迭代器)

vector本身携带了长度的信息,可以使用vec.size()获取长度

从而可以使用for循环遍历数组

int size=vec.size();
for(int i=0;i<size;i++){
​
}

除了用普通for循环,还可以使用迭代器

其提供了一种通用方法;可以访问不同类型的数据结构;我们可以将迭代器理解为一个高级的指针;

迭代器的类型是:动态数组类型::iterator

例vecotor<int>::iterator

对于一个数组,{1,3,5,7,9}

我们可以使用begin()来获取第一个元素的位置;使用end()来获取尾后的位置;当我们对迭代器做自增操作,他便会后移;他的用法如下:

vector<int> vec={1,3,5,7,9};
vector<int>:: iterator it;
for(it=vec.begin();it!=vec.end();it++){
printf("it=%\n",*it);
}

现在解决上面硬要往任意位置插入元素的问题:

因为迭代器可以访问到数组中任意一个位置;所以可以利用它对任意位置插入,删除元素。(insert和erase)

因为insert和erase会修改动态数组的结构,所以插入或修改完成后it的指向无意义。所以之后要对迭代器重新赋值。

但是这种插入操作最好避免使用;而使用push_back进行插入

vector<int>:: iterator it;
it=vec.begin();
vec.insert(it,2); //往it所在位置插入元素2
//注意迭代器要重新赋值
it=it+3;//it+3相当于3次++,只能在vector中使用
3.通过元素信息查找其位置

1.删除一个元素

我们可以使用pop_back()删除最后一个位置的元素。

vec.pop_back();

同样的,如果我们硬要删除一个位置的元素,可以使用迭代器配合erase函数。

vecor.erase(it);
2.把vector清空
vector.clear()

list的使用

前面我们讲过,即使使用迭代器配合insert和erase函数能够在任意位置对数组进行增加和删除操作,但是还是不推荐那样做。因为,如前面所言,顺序表的线性结构进行这样的操作真的很低效。所以,如果我们硬要做,就不能使用传统的线性结构,而得使用链式结构。

c++标准库为我们提供了一个链式结构的顺序表,叫list。

list的底层原理是一个双向链表。

引入

#include<list>

增 insert

前面我们在vector中对于迭代器,使用了it+=3表示迭代器it++了3次,但是因为链表中不支持随机访问,故不支持加法运算符,故只能靠自增3次来实现;

list<int> ls={1,3,4,5,6};
//获取迭代器
list<int>::iterator it=ls.begin();
it++;
it++;
it++;
ls.insert(it, 10);

it.erase();

遍历list

for(it=ls.begin();it!=ls.end();it++){
printf("it=%d\n",*it);
}

vector和list的选择

若一个题目中要求使用一个线性的数据结构,我们首选vector,

但如果你发现这个vector在使用的过程中存在着大量的对中间元素进插入和删除的操作,就改用list。

补充解惑:

1.为什么往线性表中的任意元素插入或删除元素很低效?

====》

线性表(如 vector)的底层是一个连续的内存块(数组)。在往数组中间插入或删除元素时,需要移动其他的元素。

因此 插入和删除最坏情况下的事件复杂度都是为o(n)。

2.list的增删改查都是使用迭代器完成的吗?

===>

是的,list 的增删改查主要是通过迭代器来完成的。

由于 list 是基于链表实现的, 因此没有下标访问的方式,只能通过迭代器进行增删改查。 迭代器提供了一个统一的接口来遍历、修改 list 中的元素,增加了代码的灵活性和可移植性。

ls.insert(it, 10);

ls.erase(it);

std::cout << *it << " ";

相关文章:

传统数组 vs vector和list

传统的数组&#xff1a; int arr[10]&#xff1b; 传统的数组有以下的缺点&#xff1a; 1&#xff09;长度不可修改 2)内存分配 局部数组:把数组定在函数内&#xff0c; 数组便是局部变量&#xff0c;故会被分配在栈上 但栈的大小是有限制的 &#xff0c;故其在内存中不能超…...

CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统&#xff0c;系统支持平台自营、联营、招商等多种运营模式&#xff0c;可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译&#xff01; 二、搭建教程…...

【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程

1. 简介 1.1 HTTPS HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;全称安全套接字层超文本传输协议&#xff0c;一般理解为HTTPSSL/TLS&#xff0c;通过SSL证书来验证服务器的身份&#xff0c;并为浏览器和服务器之间的通信…...

Vue2 中使用 UniApp 时,生命周期钩子函数总结

在 Vue2 中使用 UniApp 时&#xff0c;生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码&#xff0c;管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结&#xff1a; 1. beforeCreate 说明: 组件实例刚被创建&#xff0c;此时数据…...

如何在 Vue 3 中使用 Vue Router 和 Vuex

在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下&#xff0c;通过 npm 或 yarn 安装 Vue Router 4&#xff08;适用于 Vue 3&#xff09;&#xff1a; npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时&#xff0c;需要填入Semantic Object。正常来说&#xff0c;是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中&#xff0c;似乎存在一个bug&#xff0c;即无需新建也能输入自定义的Semantic Object。 如下&#xff0c;当我们任…...

【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析

在现代工业中&#xff0c;工业显示器被广泛应用于各种场景&#xff0c;从监控系统到生产控制&#xff0c;它们在实时数据显示、操作界面和信息传递方面发挥着重要作用。与普通显示器相比&#xff0c;工业显示器在耐用性、可靠性和适应特殊环境的能力上有着显著的差异。 触想工业…...

BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀

在数字化时代&#xff0c;Web培训项目的需求日益增长&#xff0c;特别是对于程序员群体&#xff0c;他们寻求高效、灵活的方式来提升自己的技能。本文将深入探讨如何评估BPMN.js与DeepSeek集成方案&#xff0c;以满足开发Web培训项目的需求。 BPMN.js 的优势 BPMN.js是一个专…...

第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础

以下是一个为期 **1 个月&#xff08;30 天&#xff09;**的详细学习计划&#xff0c;精确到每天的学习内容和练习作业&#xff0c;帮助你系统地掌握 NumPy、Pandas 和 Matplotlib 的核心功能。 第 1 周&#xff1a;NumPy 基础 Day 1&#xff1a;NumPy 简介与数组创建 学习内…...

安全测试|SSRF请求伪造

前言 SSRF漏洞是一种在未能获取服务器权限时&#xff0c;利用服务器漏洞&#xff0c;由攻击者构造请求&#xff0c;服务器端发起请求的安全漏洞&#xff0c;攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...

Flink提交pyflink任务

1.官方文档&#xff1a; flink1.14:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/cli/#submitting-pyflink-jobs flink1.18:https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/cli/#submitting-pyflink-jobs 2.提…...

对称算法模式之CTR

Note 计数器模式&#xff0c;通过加密递增计数器生成密钥流&#xff0c;后密钥流与明文分组异或得密文分组可并行性进行加密或者解密&#xff0c;性能较高明文可以是任意长度&#xff0c;不需要填充可以直接加密或解密指定块&#xff0c;块与块间不具有依赖关系 参数说明 任…...

Map 和 Set

目录 一、搜索 概念&#xff1a; 模型&#xff1a; 二、Map ​编辑 1.Map 实例化&#xff1a; 2. Map的常见方法&#xff1a; 3.Map的常见方法演示&#xff1a; 1. put(K key, V value)&#xff1a;添加键值对 3. containsKey(Object key)&#xff1a;检查键是否存在 4.…...

STOMP协议

引用&#xff1a;https://blog.csdn.net/print_helloword/article/details/142597122 什么是STOMP协议 STOMP (simple text oriented messaging protocol): 一种简单的&#xff0c;基于文本的消息传输协议&#xff0c;&#xff0c;&#xff0c;最初是为了解决在消息队列中&am…...

手动埋点的demo

上代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>埋点示例</title> </head><b…...

大模型开发实战篇5:多模态--文生图模型API

大模型文生图是一种基于人工智能大模型的技术&#xff0c;能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道&#xff0c;有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口&#xff0…...

【大模型】DeepSeek 高级提示词技巧使用详解

目录 一、前言 二、DeepSeek 通用提示词技巧 2.1 DeepSeek 通用提示词技巧总结 三、DeepSeek 进阶使用技巧 3.1 DeepSeek一个特定角色的人设 3.1.1 为DeepSeek设置角色操作案例一 3.1.2 为DeepSeek设置角色操作案例二 3.2 DeepSeek开放人设升级 3.2.1 特殊的人设&#…...

【第14章:神经符号集成与可解释AI—14.2 可解释AI技术:LIME、SHAP等的实现与应用案例】

在这里插入图片描述 凌晨三点的ICU病房,值班医生李主任盯着AI辅助诊断系统的红色警报——这套准确率高达95%的深度学习系统,突然建议对一位肾衰竭患者进行肝移植手术。正当医疗组陷入混乱时,李主任打开了系统的"解释模式",屏幕上立即跳出SHAP分析图:模型误将CT…...

Python中使用Minio实现图像或视频文件的存储

目录 一、Minio的基本介绍1.Minio是什么2.Minio的优势 二、使用步骤1.启动Minio2.创建桶3.在Python中使用Minio3.1安装并导入minio包3.2创建mino_utils工具类 三、操作演示1.引入minio_utils工具类2.上传视频文件3.获取视频文件 总结 一、Minio的基本介绍 1.Minio是什么 Mini…...

Kubernetes-master 组件

以下是Kubernetes Master Machine的组件。 etcd 它存储集群中每个节点可以使用的配置信息。它是一个高可用性键值存储&#xff0c;可以在多个节点之间分布。只有Kubernetes API服务器可以访问它&#xff0c;因为它可能具有一些敏感信息。这是一个分布式键值存储&#xff0c;所…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...