区分STL容器reserve和resize函数_stl reserve-程序员宅基地

技术标签: C/C++  c++  

首先明确两个概念:
容量:capacity,是指容器在内存中获得的内存空间,容量100并不代表容器中就有100个元素,可能容器中只有10个,剩下的90个都是闲置的未定义内存空间。

大小:size,指容器中实际元素的个数,大小为100就代表容器就有100个已经存在的元素。

reserve():用来预留容量,但并不改变容器有效元素个数

resize():用来调整容器有效元素的个数,有时也会造成容量变大
reserve()函数原型:

void reserve(size_type n);

对于n值的大小,分两种情况:

(1)如果n大于容器现有的容量(capacity),比如你容器原来是100的容量,我现在指定n=200,那么就需要在自由内存区为整个容器重新分配一块新的更大的连续空间【因为vector是顺序容器,所以存储空间是连续的,如果之前的存储空间不够了,必须这样做】,然后将容器内所有的有效元素从旧位置全部复制到新位置,这个过程是调用拷贝构造函数,然后释放旧位置的所有存储空间,并调整容器的元素位置指示器。所以reserve的时候如果n比原来的大,结果只是让容器的冗余容量(即没有分配元素的存储区)变大,容器的实际大小,即元素个数并没有改变。

(2)如果n小于容器原来的容量,那么这个函数什么作用也没有了

resize()函数原型

void resize(size_type n,const T& c = T());

其中n是要保留的元素个数,如果是要新增元素的话,c则是新增元素的默认初始值。

对于n值的大小,分三种情况:

(1)如果n大于容器当前的大小(即容器的size,这里和capacity无关),则在容器的末尾插入n-size()个初始值为c的元素;如果没有指定初始值,那就元素类型的默认构造函数来初始化。

(2)如果n小于容器当前的大小,则删除末尾的size()-n个元素,这样就导致容器的大小变了,size 变小了。但是这种类型的容器在删除一个元素的时候并不会释放元素本身的内存空间【这也是为了保留这块空间以避免将来要插入新元素的时候又要进行存储空间重分配】,所以容器的容量即capacity其实是没有改变的。

(3)n等于容器当前的大小,则什么也不做。

显然,reserve和resize的共同点就是:都不缩减容器本身的容量。即对内存空间并没有影响。那么要是当你觉得容器的容量太多的时候,应该如何缩减容量呢,这时候需要用到一个利用swap函数的技巧。
代码测试:
第一种情况:
reserve和resize中的n都大于当前容器所容纳元素的大小v.size()

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    
    vector<int> vec={
    0,1,2,3,4,5,6,7,8,9};
    vec.reserve(100);
    vec.resize(50);
    cout<<"the size of a: "<<vec.size()<<endl;
    cout<<vec[8]<<endl;
    for(auto e : vec)
        cout<<e<<" ";
    cout<<endl;

    return 0;

}

输出结果:
在这里插入图片描述
第二种情况:
当reserve中n大于v.size,而resize中n小于n

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    
    vector<int> vec={
    0,1,2,3,4,5,6,7,8,9};
    vec.reserve(100);
    vec.resize(5);  //代码修改处
    cout<<"the size of vec: "<<vec.size()<<endl;
    cout<<vec[8]<<endl;
    for(auto e : vec)
        cout<<e<<" ";
    cout<<endl;

    return 0;

}

输出结果:
在这里插入图片描述
从结果可以看出,只输出了容器中前五个元素,说明当resize中n小于容器当前size时,会改变容器当前size。这里还有个小问题,在gcc编译环境下可以访问到vec[8]位置,理论上该位置不可访问。后来我在VS2022环境下测试发现,系统崩溃,访问不了vec[8]位置。出现这种差异,可能是gcc编译器原因。
第三种情况
当reserve中n小于当前容器size的大小

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    
    vector<int> vec={
    0,1,2,3,4,5,6,7,8,9};
    vec.reserve(5);	  //代码修改处
    vec.resize(50);
    cout<<"the size of vec: "<<vec.size()<<endl;
    cout<<vec[8]<<endl;
    for(auto e : vec)
        cout<<e<<" ";
    cout<<endl;

    return 0;

}

输出结果:
在这里插入图片描述
可以发现输出结果和第一种情况输出结果一样,即调用reserve(5)后函数什么也没做。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lwd906485829/article/details/123854739

智能推荐

【Python系列】Python基础语法轻松入门—从变量到循环-程序员宅基地

文章浏览阅读1.5w次,点赞77次,收藏89次。Python 是一种高级、解释型的编程语言,具有简单易学、可读性强、开发效率高等特点。本文将介绍 Python 的基础语法,包括变量、数据类型、运算符、条件语句、循环语句等,并提供相应的示例代码。

制做自己的马赛克微信头像_马赛克头像生成-程序员宅基地

文章浏览阅读1.5w次。CSDN的排版太难用了,建议大家看回我个人博客上的原文想法2013年接近尾声了,有的媒体会用马赛克的方式,把一年中的大事件汇集到一张图片上。印象中天才少年Matrix67曾试用Mathematica制作过自己马赛克头像,于是便有了用微信朋友圈里的图片来制作一个自己的微信头像。马赛克头像觉得不像我,可以离开座位,退后一点,离显示器远点看这张图片。动手_马赛克头像生成

计算机二级试题及分值分布,计算机二级各部分分值分布-程序员宅基地

文章浏览阅读8.4k次。计算机二级考试分选择题和操作题两大类,其中选择题10题,每题2分,一共20分;操作题分字处理题、电子表格题、演示文稿题三大类,其中字处理题30分,电子表格题30分,演示文稿题20分,共计80分。计算机二级各科目考试题型及分值二级 MS Office 高级应用单项选择题 20分(含公共基础知识部分10分)文字处理题(word)30分电子表格题(excel)30分演示文稿题(powerpoint)20..._计算机二级wps真题4分值

误差评价:均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation)_均方根误差评价-程序员宅基地

文章浏览阅读1.2w次。1、均方根值(RMS)也称作为效值,它的计算方法是先平方、再平均、然后开方。 2、均方根误差,它是观测值与真值偏差的平方和观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感,所以,均方根误差能够很好地反映出测量的精密度。均方根误差,当对某一量进行甚多次的测量时,取这一测量列真误差的均方_均方根误差评价

Houdini常用SOP节点_houdini cube划分-程序员宅基地

文章浏览阅读1.6k次,点赞5次,收藏38次。Houdini常用SOP节点_houdini cube划分

.netcore 微服务快速开发框架 Anno&Viper_anno框架-程序员宅基地

文章浏览阅读842次。1、什么是锁锁是为了解决多线程或者多进程资源竞争的问题。同一进程的多个线程资源竞争可以用lock解决。lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。复制代码class Test{//定义一个私有成员变量,用于Lockprivate static object lockobj = new object();void DoSomething(){lock (lockobj)_anno框架

随便推点

ROI Pooling和ROI Align_python roi align pooling-程序员宅基地

文章浏览阅读59次。ROI Pooling和ROI Align_python roi align pooling

vue导出自定义的excel表格_vue中导出自定义表格-程序员宅基地

文章浏览阅读535次。vue,结合file-saver、xlsx,导出excel,并对导出前的excel进行自定义,比如文字大小、颜色、单元格宽度、单元格合并等_vue中导出自定义表格

forager有多少个机器人_同花顺外呼机器人助力中国移动开启“人工智能”新营销...-程序员宅基地

文章浏览阅读238次。传统电话营销转型“人工智能”2018年9月底,同花顺为中国移动某地分公司量身定制的智能外呼机器人正式上线,开启全新的电话营销模式,标志着该移动公司从传统的人工电话营销成功转型为“人工智能”新营销。同花顺智能外呼机器人是一个可以代替真人,自动拨打电话的智能语音系统,一个电话机器人一天外呼量能够达到800-1000个,并能根据跟客户的交流情况,自动筛选意向客户。产品适用于证券、金融、房产、保险、催收、..._中国移动智能外呼

SFTP的使用-程序员宅基地

文章浏览阅读161次。SFTP的使用:1.项目中需要引入jar包,下载地址:https://sourceforge.net/projects/jsch/files/jsch.jar/2.需要下载SFTP服务器,下载地址:http://www.freesshd.com/?ctt=download 服务器的配置参考:http://www.cnblogs.com/zxx-813/p/7353806.html、..._sftpattrsapi

高仿微信图片选择器----LQRImagePicker_com.lqr.imagepicker-程序员宅基地

文章浏览阅读844次。LQRImagePicker完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成矩形或圆形,可以配置各种其他的参数github地址:https://github.com/GitLqr/LQRImagePicker一、简述:本项目是基于ImagePicker完善及界面修改。主要工作:原项目中UI方面与微信有明显差别,如:文件夹选择菜单的样式就不是很美观..._com.lqr.imagepicker

Elasticsearch专栏-8.es读写性能及优化_es 优化大量写性能-程序员宅基地

文章浏览阅读6.6k次,点赞5次,收藏18次。es读写性能及优化_es 优化大量写性能