【C++】vector 释放,二维vector开辟 使用

文章目录

    • vector容器的内存释放
      • 释放方法
    • 使用vector开辟一个二维数组
      • 开辟一段已知大小的二维vector
      • 使用一段已经开辟的二维vector
      • 开辟一段未知大小的二维vector

vector容器的内存释放

首先对于数据量较小的vector容器,没有太多必要自己进行主动释放,小容量vector容器对程序效率没有太多影响。

对于大容量的vector,可以进行积极主动的释放,可以提升内存等效率。

释放方法

vector关于清除释放方面,有clear()、swap()、shrink_to_fit()函数。

释放vector内存有两种常见的做法:

// 方法一:clear()+shrink_to_fit()
#include<iostream>
#include<vector>
int main(){std::vector<int> vec;vec.push_back(1);vec.push_back(2);// 释放vec.clear();vec.shrink_to_fit();return 0;
}
// 方法二:swap()
int main(){std::vector<int> vec;vec.push_back(1);vec.push_back(2);// 释放std::vector<int> ().swap(vec);return 0;
}

为什么单独的std::vector clear()方法不能够释放?

因为其方法是 Removes all elements from the vector (which are destroyed), leaving the container with a size of 0;即它会把size重置为0,但是内存仍然被占据。vector容器中两个重要的概念是size和capacity;这是两个概念,size和capacity并非一个事情。clear()清除了vector中的内容但是并没有释放内存,即容器的capacity不为0。可参考C/C++编程:正确释放vector的内存(clear(), swap(), shrink_to_fit())中的程序。

swap()函数为什么可以?

Exchanges the content of the container by the content of x, which is another vector object of the same type. Sizes may differ.

After the call to this member function, the elements in this container are those which were in x before the call, and the elements of x are those which were in this. All iterators, references and pointers remain valid for the swapped objects.

Notice that a non-member function exists with the same name, swap, overloading that algorithm with an optimization that behaves like this member function.

个人理解是std::vector<int> ()这个过程并没有真正的分配空间,也就是说这个vector容器的capacity为0,相当于只是声明了这个变量而已,std::vector<int> ().swap(vec)只是让vec指向这个声明变量,所以vec之前指向的空间就被释放掉了。

另外,有时候可能存在内存虽然在程序释放了,但是这段空间实际上还没有归还给系统的情况,故可以在释放后跟随一句malloc_trim(0),是程序归还空间给系统;不过对于容量比较小的容器,一般是不需要这样做的。

使用vector开辟一个二维数组

vector开辟二维数组的好处是对于小容量的数组,可以不用自己关心释放问题;其次,并不需要确切知道二维数组的大小;第三,二维中的一维数组可以是不同长度的。

开辟一段已知大小的二维vector

// 方法一:
vector<vector<int> > a;
a.resize(row, vector<int>(column));// 方法二:
vector<vector<int> > a(row, vector<int>(column)); //默认用0初始化
//vector<vector<int> > a(row, vector<int>(column,-1));//用-1初始化二维数组
// 注:如果row > a.size(),则在a.end()之前插入vector<int>(column)的row次拷贝,相当于row行column列// 方法三:
vector<vector<int> > a;
a.resize(row);
for (int i = 0; i < row; ++i)a[i].resize(column);// 方法三和常规使用new开辟数组的操作一样
int **map = new int* [map_height];
for(int i = 0; i < map_height; i++)map[i] = new int [map_width];
// 不过new出来的空间需要自己手动释放,new分配的空间使用delete释放
for (int i = 0; i < map_height; i++)delete []map[i];
delete []map;

使用一段已经开辟的二维vector

记住,如果已经开辟了这段空间,那么就不要再使用std::vector push_back()来进行操作了。因为push_back()函数是在这个vector的后面继续新增一个空间来存储push进来的内容。如果已经开辟了二维vector,请直接使用下标来访问。

// 假设row = 20, column = 20
vector<vector<int> > a(row, vector<int>(column)); //默认用0初始化
a[1][1] = 1;
a[1][2] = 2;
// 这样进行赋值或访问即可。

开辟一段未知大小的二维vector

std::vector<std::vector<int> > a;
std::vector<int> temp_line;
for (int i = 0; i < 20; i++)temp_line.push_back(i);
a.push_back(temp_line);

对未知大小的二维数组进行存储,先声明一个二维vectorstd::vector<std::vector<int> > a;然后不断向其中push_back一维的vectorstd::vector<int> temp_line即可。

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

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

相关文章

Svg Flow Editor 原生svg流程图编辑器(五)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

使用tomcat里的API - servlet 写动态网页

一、创建一个新的Maven空项目 首次创建maven项目的时候&#xff0c;会自动从maven网站上下载一些依赖组件&#xff08;这个过程需要保证网络稳定&#xff0c;否则后续打包一些操作会出现一些问题&#xff09; ps:校园网可能会屏蔽一些网站&#xff0c;可能会导致maven的依赖…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提&#xff0c;本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵&#xff0c;所以要先生成两个bram核&#xff0c;用于缓存前两行图像数据 在 IP catalog中选…

刷代码随想录有感(24)

有时候我会怀疑努力的意义&#xff0c;因为我总是花人家好几倍的时间去理解一个狗看了都觉得弱智的问题&#xff0c;思考过后我知道&#xff0c;努力本没有意义&#xff0c;是在未来可能十年内取得成就时突然回想起来之前做过一些事情&#xff0c;未来的成就赋予曾经的意义&…

说说虚拟化上部署Oracle RAC的那点注意事项

0.概述 目前在虚拟化上部署RAC主要是以下3个场景 1是VMWARE的虚拟化&#xff08;私有云&#xff09;&#xff1b; 2是国产厂商基于KVM的虚拟化&#xff08;私有云&#xff09;&#xff1b; 3是公有云&#xff0c;由云厂商给你提供虚拟主机和虚拟磁盘。 这里我只对前2个熟悉一些…

【微服务】面试题(一)

最近进行了一些面试&#xff0c;这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务&#xff08;Microservices&#xff09;和分布式系统&#xff08;Distributed Systems&#xff09;是两种不同的软件架构风格&#xff0c;虽然它们之间有些重叠&#…

SpriingBoot整合MongoDB多数据源

背景&#xff1a; MongoDB多数据源&#xff1a;springboot为3以上版本&#xff0c;spring-boot-starter-data-mongodb低版本MongoDBFactory已过时&#xff0c; 改为MongoDatabaseFactory。 1、pom引入&#xff1a; <dependency><groupId>org.springframework.boo…

汇编基础----mov基本操作

汇编基础----mov基本操作 下载VS2022 这个网上教程很多,自行下载安装即可 新建项目 选择空项目,如何点击下一步 在源文件下创建这二个文件 修改配置使asm文件能被解析,右击项目名(demo)->生成依赖项->生成自定义->勾选如下图所示选项->确定 立即数寻址 main…

2849: 【广度优先】【优先队列】游戏装备

题目描述 小未在玩一款武侠游戏&#xff0c;游戏里PK不仅要有高超的操作和智慧&#xff0c;还要有很牛的装备。现在他进入了一个副本&#xff0c;副本里面有极品15星的装备宝箱&#xff0c;但是从副本入口到宝箱有很多条路&#xff0c;当然不可能轻轻松松的拿到极品装备。一路…

Azure AI 新发布了 9 种更逼真的对话 AI 声音

Azure AI 新发布了 9 种更逼真的对话 AI 声音 0. 引言1. 更逼真的声音示例 0. 引言 Microsoft 一直在寻找使用 AI 提高创造力、生产力和技能的新方法。随着高质量、类人 AI 语音的出现&#xff0c;行业和应用程序正在发生转变&#xff0c;使与设备和服务交互变得更加容易和自然…

qt环境搭建-镜像源安装Qt Creator(5.15.2)以及配置环境变量

前言&#xff1a; 版本&#xff1a;5.15.2 镜像源&#xff1a;ustc与清华 纯小白&#xff0c;找了半天的镜像源安装qtcreator&#xff0c;搞了半天结果安装的是最新的&#xff0c;太新的对小白很不友好&#xff0c;bug比较多&#xff0c;支持的系统也不全&#xff0c;口碑不…

【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【小提琴系列1 python】绘制按分类变量分组的垂直小提琴图&#xff0c;文末附完整代码 小提琴图是一种常用的数据可视化工具…

鸿蒙原生应用已超4000个!

鸿蒙原生应用已超4000个&#xff01; 来自 HarmonyOS 微博近期消息&#xff0c;#鸿蒙千帆起# 重大里程碑&#xff01;目前已有超4000个应用加入鸿蒙生态。从今年1月18日华为宣布首批200多家应用厂商正在加速开发鸿蒙原生应用&#xff0c;到3月底超4000个应用&#xff0c;短短…

约跑小程序源码(asp.net+vue+element++uniapp+sqlserver)

开发语言&#xff1a;c# 框架&#xff1a;后端 asp.net mvc pc管理页面&#xff1a;vueelement 数据库&#xff1a;sqlserver 开发软件&#xff1a;eclipse/myeclipse/idea 浏览器&#xff1a;谷歌浏览器 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X …

PyCharm关闭项目后等待时间长

每次关闭项目或PyCharm时&#xff0c;会显示正在关闭项目&#xff0c;而这个关闭时间很长且不可确定&#xff0c;很浪费我们的时间&#xff0c;不过愿意等的话&#xff0c;倒也是可以。 解决方法 Help -> Find Action -> 查找 Registry -> 禁用 ide.await.scope.comp…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

@SpringBootApplication 详解

SpringBootApplication 详解 SpringBootApplication标识在Spring工程的引导启动类上&#xff0c;是Spring最最最重要的注解&#xff0c;封装了如下注解&#xff1a; SpringBootConfiguration&#xff1a;底层封装了Configuration&#xff0c;用于声明当前类也是一个配置类。E…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

【QT+QGIS跨平台编译】076:【libdxfrw跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、libdxfrw介绍二、QGIS下载三、文件分析四、pro文件五、编译实践一、libdxfrw介绍 libdxfrw是一个用于读取和写入DXF(Drawing Exchange Format)文件的开源C++库。DXF是一种由AutoCAD开发的文件格式,用于存储CAD(计算机辅助设计)图形数据,它…

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…