vector.resize 与 vector.reserve的区别

STL中resize与reserve的区别?—— C++ STL vector的容量管理 该方法会按照指定的元素数量和初始值参数来改变vector的size()和内容,如果新的元素数量n大于vector当前的元素数量size(),则会在vector的末尾添加默认初始值的元素;该方法会对vector进行内存预分配,但并不会增加vector的元素数量,也就是说,调用reserve方法后,vector的size()不会发生变化。reserve方法和resize方法是C++ STL vector容量管理中常用的方法,它们可以帮助我们灵活地管理vector的内存空间,提高程序的性能。 阅读详情

reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:

vector<int> myVec; 


myVec.reserve( 100 ); // 新元素还没有构造, 


// 此时不能用[]访问元素 


for (int i = 0; i < 100; i++ ) 


...{ 


myVec.push_back( i ); //新元素这时才构造 


} 


myVec.resize( 102 ); // 用元素的默认构造函数构造了两个新的元素 


myVec[100] = 1; //直接操作新元素 


myVec[101] = 2; 


 






初次接触这两个接口也许会混淆,其实接口的命名就是对功能的绝佳描述,resize就是重新分配大小,reserve就是预留一定的空间。这两个接口即存在差别,也有共同点。下面就它们的细节进行分析。
为实现resize的语义,resize接口做了两个保证:
一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。
reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。
resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。
因两接口的源代码相当精简,以至于可以在这里贴上它们:
void resize(size_type new_size) { resize(new_size, T()); }
void resize(size_type new_size, const T& x) {
if (new_size < size()) 
erase(begin() + new_size, end()); // erase区间范围以外的数据,确保区间以外的数据无效
else
insert(end(), new_size - size(), x); // 填补区间范围内空缺的数据,确保区间内的数据有效


vector的扩容原理、resize与reserve的区别 vector 存储的空间在内存中是连续的,如果 vector 现有空间已存满元素,在 push_back 新增数据的时候就要分配一块更大的内存,将原来的数据 copy 过来,接着释放之前的内存,再在新的内存空间中存入新增的元素。不同编译器对 vector 的扩容方式实现不一样,在 vs 中以 1.5 倍扩容,而在 gcc 中以 2 倍扩容,后面我们会看到以 1.5 倍扩容的方式效果更好。 阅读详情

相关推荐

Windows下用Python调用科大讯飞语音唤醒SDK的避坑指南(附完整代码)

本文详细介绍了在Windows平台使用Python调用科大讯飞语音唤醒SDK的全流程,包括环境配置、核心代码实现、典型问题解决方案及进阶开发技巧。通过完整的代码示例和避坑指南,帮助开发者快速集成语音唤醒功能,提升开发效率。

u0v1w2x3的博客 405

C++ STL,resize 和 reserve 的区别

resize和reserve扩容处理的区别,带来了主要问题就是push函数使用问题,比如vector的push_back()函数,如果是resize之后再push_back,容器会继续扩容,因为这时候容器已经满了;如果是reverse之后push_back,则会放到vector现有元素的后边。

a1367666195的博客 681

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2122

STL容器的reserve()函数和resize()函数解析

以vector为例,可以用reserve()和resize()函数来为容器预留空间或者调整它的大小。不过从它俩的名字上可以看出区别: reserve():serve是“保留”的词根,所以是用来保留,预留容量的,并不改变容器的有效元素个数。 resize():size是“大小”的意思,它主要用来调整容易有效元素的个数,有时候也会造成容量变大。 先解释两个概念: 容量:即capacit

邓无邪的博客 2030

LTC2990电池监控芯片I²C驱动开发与多通道同步采样实践

电池监控是嵌入式电源管理系统的核心环节,其本质依赖高精度模拟信号采集、数字转换与实时状态评估。LTC2990作为集成电压/电流/温度三合一的专用监控IC,通过真差分输入、内置基准和I²C数字接口,显著简化了SOC/SOH估算的硬件链路。其技术价值在于以单芯片替代传统ADC+运放+传感器组合,在宽压(2.7–36 V)、高共模(80 V)场景下保障工业级测量可靠性。典型应用于电动工具、车载BMS、UPS及便携式储能设备的电池健康监测子系统。本文聚焦LTC2990底层驱动实现,涵盖I²C时序约束、寄存器原子读写

weixin_42599558的博客 131

Camera 基础知识

Raw Sensor输出的Data格式为Raw,图像的效果处理使用BB端的ISP,BB端接收Raw data后进行一系列的图像处理(OB,Shading,AWB,Gamma,EE,ANR等),效果方面由BB端控制,需要针对不同的模组进行效果调试,Raw sensor是目前的主流,数据量比YUV Sensor小(RAW10 格式的sensor 1个pixel 10个bit)使用平台ISP处理,能支持较大的size。不过,相位对焦并不是那么完美,它对光线的要求就比较高,在弱光拍摄环境下,相位对焦就无能威力了。

手机-手表蓝牙开发工程师的博客 3062

STL中resize()与reserve()的区别

首先了解2个概念: size指容器当前拥有的元素个数, capacity则指容器在必须分配新存储空间之前可以存储的元素总数,即预分配存储空间的大小。 vector的存放有3种 1.普通:vecotr<int> V1; for(int i = 0; i < 100; ++i) { V1.push_back(1); } 效率最低。每push_ba...

sunflower_della的博客 785

手把手教你学PCIE(9.3)--pcie常见故障及原因:配置错误介绍

PCIe 设备的配置错误可能涉及操作系统设置、BIOS 设置、驱动程序设置和配置文件设置等多个方面。通过以上方法,可以有效地诊断和解决 PCIe 设备的配置错误。

MHD0815的博客 2437

C++ vector中resize()和reserve()区别

vector中resize 和 reserve区别resize 和 reserve区别1、reserve()避免多次不必要的扩容2、resize是改变容器的大小,且创建对象3、resize()和reserve()区别 resize 和 reserve区别 1、reserve()避免多次不必要的扩容 成员方法 功能 capacity() 告诉我们当前 vector 容器总共可以容纳多少个元素。如果想知道当前 vector 容器有多少未被使用的存储空间,可以通过 capacity()-size(

JMW1407的博客 2万+

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 331

Transformers 实战修炼与源码剖析专栏大纲

本专栏以 Hugging Face Transformers 为主线,围绕“能用、会调、敢上线、懂源码”四个目标展开。内容不把理论堆成公式墙,而是用真实或拟真的业务场景驱动:客服分类、合同抽取、知识库问答、模型微调、推理服务、监控告警、源码扩展等。采用“业务痛点 → 三人剧本对话 → 代码实战 → 总结思考”的四段式结构,让读者在动手完成一个个小项目的过程中,逐步理解 Tokenizer、Model、Pipeline、Trainer、Generation、PEFT、Accelerate、Serving等概念

davidwang456的专栏 922

vector容器中resize与reserve的区别

Vector中的resize()与reserve()的区别 首先申明resize()和reserve()这两个成员函数都是Vector的公有成员函数(public  member function) 一、先了解vector容器的构成: 1.首先明白vector是一种顺序容器(申请的内部空间是连续的) 2.它的底层是由类模板实现的 二、这两个成员函数的意

MaHua的博客 1万+

[nlp] 自然语言理解基准 ATIS Snips

ATIS 4k 21 Intents(not include UNK) 120 SlotsSNIPS 13k 7 Intents(not include UNK) 72 SlotsATIS Benchmark (Intent Detection) | Papers With CodeSNIPS Benchmark (Intent Detection) | Papers With Code

心宝的博客 747

指定C++ vector、二维vector的大小及resize与reserve的区别

前言 vector是一个动态的数组,我们最常使用push_back()向vector中添加元素。但是有时候我们希望在vector创建之后就按照下标来访问vector中的元素,如果直接v[i]是会报错的,因为此时vector的size是0,其中还没有元素。如何初始化vector到我们想要的大小呢。这就需要用到vector的resizeh函数了。 resize 首先看resize的函数原型 void ...

Lavi的专栏 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

vector中reserve与resize区别

vector中reserve与resize区别 一、基本概念 1、capacity 指容器在分配新的存储空间之前能存储的元素总数。 2、size 指当前容器所存储的元素个数 二、reserve与resize 1.区别 1、reserve()只修改capacity大小,不修改size大小, 2、resize()既修改capacity大小,也修改size大小。 注意:resize只会在修改后的size()大小大于当前capacity()大小时才会修改capacity大小,比如下面情况就不会修改capacity:

wuxiecsdn的博客 4248

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vector中的reserve和resize的区别

vector中的reserve和resize的区别 reserve:分配空间,更改capacity但是不改变size resize:分配空间,同时改变capacity和size 详解: 1)  reserve只是预留空间大小,并没有实际创建元素,所以不能引用其中的元素,此时vector的容量等于预留空间的大小,size为0;需要用push_back()/insert()函数插入元素。 2

Eliot 2968

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

vector中reserve与resize的区别

搞清楚这两个区别之前,先要搞清楚vector的原理和size与capacity的区别,可参考我写的另一篇文章。 reserve是容器预留空间,但在空间里不真正创建对象。也就是capacity。 resize是改变容器大小,且创建元素。也就是size。 std::vector<int> v1; v1.reserve(10); std::cout <<"v1.size = "<<v1.size() <&lt...

new9232的博客 2290

vector 的 reserve 和 resize 的区别

如果新的大小大于原来的大小,会在 vector 末尾添加默认构造的元素;如果新的大小小于原来的大小,会删除超出部分的元素。同时, resize 也可能会引起内存的重新分配,以适应新的元素数量。- reserve :主要用于预先分配一定大小的内存空间,以避免在元素插入过程中频繁地重新分配内存,提高程序性能。在上述示例中, reserve 后 vector 的大小不变,容量变为10;也可以接受两个参数,第一个参数是新的元素个数,第二个参数是用于初始化新添加元素的值。// 使用resize改变大小。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 1096

STL的vector中resize()和reserve的区别

STL的vector中resize()和reserve的区别 resize()和reserve()这两个成员函数都是Vector的公有成员函数 在分析这两个函数区别之前先得清楚capacity和size的含义: 容量:即capacity,是指容器在自由内存中获得了多大的存储空间,不一定使用完; 大小:即size,指的是容器中实际元素的个数,表示你已经存在的元素的个数 1. reserve() vo...

jacky_789的博客 770

vector中resize与reserve的区别

resize()是真正扩容+造人(创建对象),size变了reserve()是提前盖房子(只分配空间),人还没搬进来,size不变😀 关注 @公众号 程序员陈子青,获取更多 C++ 技术支持。

陈子青的博客 439

C++ vector的reserve和resize的区别与联系

一、原理 看看《C++ Primer》中对resize()函数两种用法的介绍: resize(n):调整容器的长度大小,使其能容纳n个元素。如果n小于容器的当前的size,则删除多出来的元素。否则,添加采用值初始化的元素。 resize(n,t):多一个参数t,将所有新添加的元素初始化为t 而reserver()的用法只有一种reserve(n),即预分配n个元素的存储空间。 了解这两...

sinat_31608641的博客 530

c++中vector的 resize()和reserve()区别

vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size! 原因如下:       reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。       r

小鱼的专栏 1837

vector的resize()和reserve()函数的区别

reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。再者,两个函数的形式是有区别的,reserve函

3940
上一篇: vector容器与iterator迭代器
下一篇: 容器适配器
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值