【C++】详解vector二维数组的全部操作(超细图例解析!!!)

news2024/11/28 20:41:27

目录

一、前言

二、 深度理解vector 的二维数组(重点!)

 三、vector 二维数组的空间理解(重点!)

✨问题分析

✨如何合理定制vector的内存空间

 四、vector 二维数组的初始化

五、vector 二维数组的 添加与删除

✨添加一行

✨添加一列

✨删除一行

✨删除一列

六、常考面试题

 七、共勉


一、前言

    最近在刷 Leetcode 的时候,发现 vector 的二维数组操作 都还没弄明白吗,但是STL的强大是众所周知滴,早晚都是要解决滴,因此专门写下这篇文章,以供自己复习和各位老铁使用,快速的回忆vector的用法,让你找回自信,不用再竞赛的时候颜面尽失。
    vector 的一维操作可以看看之前这篇文章哦:vector 详解

二、 深度理解vector 的二维数组(重点!)

     在解决大部分算法问题的时候,通常都会遇到二维数组 vector<vector<int>> table, 但是不知道怎么对其进行初始化(初始化时指定二维容器的大小),于是通过查阅了很多资料,将其总结如下:

vector<vector<int>> table(size1, vector<int>(size2, 0));

 代码说明:声明一个名为 table 的容器,其元素为 vector的容器。简单来说类似一个int型的二维数组。

这样,就得到了一个如下图所示的二维容器。 

 具体代码的内容,可以这样理解:

 图中,我将外围容器table的初始化参数分成了两部分 A、B 

  • A: table外围容器的大小
  • B: table外围容器的内容,即 size1个vector型的元素。
  • B1:内部容器的大小
  • B2:内部容器的内容

观察规律,可以得出如下的初始化格式:容器(大小,内容)

 三、vector 二维数组的空间理解(重点!)

      我们都知道,在 C语言 中,创建一维数组或者更高维度的数组时,都是需要提前给他分配大小的。
      而在 C++的 vector 容器 中我们并不需要那么做,我们可以直接push进去后,根据下标访问它,如:

 ✨问题分析

	vector<int> a;
	a.push_back(1);
	cout << a[0];

 由此处诞生出了两个问题

  1.  在处理小数据是没问题的,但处理大数据时,vector 会重新分配内存,一般会把容量(所分配好的内存空间)翻倍,这将导致出现大量的冗余空间。
  2. 在对二维的数组创建时,会出现创造失败的情况,如下面的情况就会报错:
vector<vector<int>> a;  // 创建一个空的二维向量a
a[0].push_back(1);       // 尝试访问a的第一个元素(即空向量),然后在其上调用push_back()方法,但是a目前为空,没有索引为0的元素,因此这将导致访问越界错误。
cout << a[0][0];         // 试图输出a的第一个元素的第一个元素,但是由于a为空,这也会导致访问越界错误。

错误原因: 

  1. 尝试访问 a 的第一个元素(即空向量),然后在其上调用push_back()方法,但是a目前为空,没有索引为 0 的元素,因此这将导致访问越界错误。
  2.  试图输出 a 的第一个元素的第一个元素,但是由于a为空,这也会导致访问越界错误。

✨如何合理定制vector的内存空间

首先要明白,我们第二个问题的出现,其实就是因为第一个问题,那么我们逐个分析一下:

  • 对于 vector 的 .size() 代表查询它的 动态数组vector中有多少个有效数。
  • 对于 vector 的.capacity()代表查询它的容量(最多放多少个数)。

 如何理解这两个函数接口呢?

  • resize(Container::size_type n)强制把容器改为容纳n个元素。调用resize之后,size将会返回n。如果n小于当前大小,容器尾部的元素会被销毁。如果n大于当前大小,新默认构造的元素会添加到容器尾部。如果n大于当前容量,在元素加入之前会发生重新分配。
  • reserve(Container::size_type n)强制容器把它的容量改为至少n,提供的n不小于当前大小。这一般强迫进行一次重新分配,因为容量需要增加。(如果n小于当前容量,vector忽略它,这个调用什么都不做,string可能把它的容量减少为size()和n中大的数,但string的大小没有改变。

 【总结】上述两方法的区别

  1. reserve表示容器预留空间,但并不是真正的创建对象,需要通过insert()或push_back()等创建对象resizee既分配了空间,也创建了对象
  2. reserve只修改capacity大小,不修改size大小,resize既修改capacity大小,也修改size大小。
  3. resize带两个参数,一个表示容器大小,一个表示初始值(默认为0)。reserve只带一个参数,表示容器预留的大小。
  4. 因此,我们在对一维数组push前,可以来一个reverse,这样在不断push的过程中就不会发生重新分配了。如:vector<int> a; a.reserve(1000);

所以针对问题二出现的原因:vector 直接根据下标访问必须要先push,存在数才行。而上面的代码想直接对第一行里面的各个元素进行访问或者修改时绝对不行的。但是相反,如果我们先对第一行进行赋值,然后再访问,这样又是可以的,如:

vector<vector<int>> a;
a.push_back(vector<int>()); // 添加一个空的一维向量
a[0].push_back(1);          // 现在可以向a的第一个元素(现在是一个向量)添加元素了
cout << a[0][0];            // 输出1

 因此,想要直接对第一行第一列的进行调整,就需要我们预先给他点空间了!!

 四、vector 二维数组的初始化

首先,要先知道:二维 vector 如何获得行数和列数。

vector<vector<int>> a(r, vector<int>(c));
int row = a.size();          //获取行数
int column = a[0].size();    //获取列数

 方法一:定义时,直接初始化
(1)下面定义的是行为r,列为c的二维数组

vector<vector<int>> ans(r, vector<int>(c));

(2)下面定义的是行为r,列为c的二维数组,初始值为0

vector< vector<int> > a(r, vector<int>(c, 0)); 

方法二:用resize来提前构建

(下面定义的是行为r,列为c的二维数组,初始值为0–因为resize默认为0)

vector<vector<int>> new_mat(r);//注意这个r是不可缺少的,规定其有多少行
for(int i=0 ;i<r; i++) //二维vector的初始化时有要求的
{
   new_mat[i].resize(c);
}

方法三:每行不一定几个数,就是想对每行的列进行操作

vector<vector<int>>mat(r);//每行的定义
mat[i].push_back(1);//这就是该第i-1行的插入一个元素,值为1

 

五、vector 二维数组的 添加与删除

✨添加一行

//插入一行数组:将in_row数组插入到第2行! 
vector<int> in_row(5,6);//初始化一个数组,包含5个元素并且全为6
a.insert(a.begin()+2,in_row);

✨添加一列

for(int i=0;i<a.size();i++)
{
	a[i].insert(a[i].begin()+2,9);
}

✨删除一行

a.erase(a.begin() + 2, a.begin() + 3);

✨删除一列

//删除a的第二列
	for (int i = 0; i < a.size(); i++)
	{
		a[i].erase(a[i].begin() + 2, a[i].begin() + 3);
	}

六、常考面试题

题目:杨辉三角形
链接:118. 杨辉三角

class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        // 生成一个二维数组
       vector<vector<int>> vv;
       // 给二维数组开辟有效空间---开辟numRows行
       vv.resize(numRows);

       for(int i = 0;i<numRows;i++)
       {
           //每一行开辟i+1个 空间,并且进行初始化为 0 
           vv[i].resize(i+1,0);
           //每一行的第一个和最后一个为 1
           vv[i].front() = vv[i].back() = 1;
       }
         
         // 每一次都从第3行开始,第二个开始遍历
       for(int i = 2;i<numRows;i++)
       {
           for(int j = 1;j<i;j++)
           {
               vv[i][j] = vv[i-1][j-1] + vv[i-1][j];
           }
       }
       return vv;

    }
};

 七、共勉

 以下就是我对【C++ STL】vector 二维数组 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++STL库的理解,请持续关注我哦!!!

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

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

相关文章

宝宝眼部健康,斗鸡眼小心防护

引言&#xff1a; 新生儿期间&#xff0c;宝宝的眼睛需要特别关注和呵护&#xff0c;因为眼睛是宝宝感知世界的窗户。斗鸡眼&#xff0c;即眼球表面的角膜上形成的小疙瘩&#xff0c;虽然在新生儿中比较罕见&#xff0c;但家长们仍然需要了解斗鸡眼的相关知识&#xff0c;并采取…

Vue 有哪些主要的指令修饰符

目录 1. 什么是指令修饰符 2. 指令修饰符有哪些 2.1. 按键修饰符 2.2. v-model修饰符 2.3. 事件修饰符 1. 什么是指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 目的&#xff1a;简化代码 2. 指令修饰符有哪些 2.1. 按键…

让chatGPT控制物理设备

作为自动控制行业的工程师&#xff0c;我们也许最关心的是如何使chatGPT 控制物理设备。我发现许多人仍然停留在传统程序设计的思维阶段&#xff0c;比如让大模型编写一段PLC 代码&#xff0c;或者是生成一些信息模型。 其实大模型具备判断与思考的能力&#xff0c;AI …

尚硅谷html5+css3(2)CSS5基本知识

1.网页分为三个部分&#xff1a; 结构&#xff1a;HTML 表现&#xff1a;CSS 行为JavaScript CSS:层叠样式表&#xff0c;网页实际上是一个多层结构&#xff0c;通过CSS可以分别为网页的每一个层来设置样式&#xff0c;最终用户只看最上面的一层&#xff0c;总之&#xff0…

适用于 Windows 10 的 10 大免费数据恢复软件

数据丢失可能是一场噩梦&#xff0c;尤其是在涉及重要文件和文档时。无论是由于意外删除、系统崩溃还是病毒攻击&#xff0c;找到适合 Windows 10 的文件夹恢复软件都可以在恢复丢失的数据方面发挥重要作用。在本指南中&#xff0c;我们将探索适用于 Windows 10 用户的 10 大免…

景区云旅游/视频慢直播方案设计与平台搭建

一、行业背景 经文化和旅游部数据中心测算&#xff0c;今年清明节假期3天全国国内旅游出游1.19亿人次&#xff0c;按可比口径较2019年同期增长11.5%&#xff1b;国内游客出游花费539.5亿元&#xff0c;较2019年同期增长12.7%。踏青赏花和户外徒步成为假期的热门出游主题。随着…

Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066

很奇怪的问题,在使用nifi的时候碰到的,这里是用NIFI,把数据从postgresql中同步到mysql中, 首先postgresql中的源表,中是没有create_time这个字段的,但是同步的过程中报错了. 报错的内容是说,目标表中有个create_time字段,这个字段是必填的,但是传过来的flowfile文件中,的数据没…

Windows命令行关机操作

cmd相关备忘 1. 导语2. Windows本命操作3. 实用命令集合3.1. 一段时间后关机3.2. 立即关机命令3.3. 一段时间后重启3.4. 休眠命令3.5. 取消指令 &#x1f609; 记录一些不常用有的时候很救命的cmd命令 1. 导语 不知道小伙伴们有么有遇到过这样尴尬的时候&#xff0c;电脑的鼠标…

1.网络编程-网络协议

目录 网络编程是什么 网络编程三要素 OSI七层网络模型 TCP/IP五层模型 SSL/TLS 是哪层协议 网络编程是什么 网络编程是计算机科学中的一个重要领域&#xff0c;它涉及到编写能够在网络环境中进行通信的程序。网络编程的核心目标是使不同的设备能够通过网络交换信息&#…

Python爬虫基础篇章(面试常问1)

如今信息技术的发展已经进入“数据”驱动的时代&#xff0c;通过对海量数据的处理&#xff0c;能够产生极大的科研和商业价值。网络爬虫的出现&#xff0c;将网络上的各种数据进行自动汇总&#xff0c;定制化产生需要的数据&#xff0c;是当今时代数据获取的重要来源。网络爬虫…

《Market Insight:中国流程挖掘市场发展洞察(2023)》报告将于4月11日发布

流程挖掘市场虽然项目数量有所增加&#xff0c;但目前的中国市场依旧处于早期阶段。而伴随着生成式AI技术的发展&#xff0c;流程挖掘市场又将迎来的新的变革和机遇&#xff0c;RPA中国在调研中发现&#xff0c;诸多技术供应商在努力地拥抱生成式AI&#xff0c;以便于提升自身产…

3D渲染器原理及Python朴素实现

最近&#xff0c;我发现自己需要为即将进行的项目提供一些来自不同角度的低多边形 3D 模型的低分辨率精灵。 像这样的东西&#xff1a; 获得它们的可能方法包括&#xff1a; 学习一点 Blender在 WebGL 中制作编写我自己的渲染器 我对 Blender 的短暂经历已经让我受到了创伤&…

24 个Intellij IDEA好用插件

24 个Intellij IDEA好用插件 一. 安装插件 Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句&#xff0c;这也太智能了&#xff0c;还显示了每条语句使用频率。 原因是它学习了我的项目代码&#xff0c;总结出了我的代码偏好。 Key Promoter X 快捷键提示插件 …

CCIE-10-IPv6-TS

目录 实验条件网络拓朴 环境配置开始Troubleshooting问题1. R25和R22邻居关系没有建立问题2. 去往R25网络的下一跳地址不存在、不可用问题3. 去往目标网络的下一跳地址不存在、不可用 实验条件 网络拓朴 环境配置 在我的资源里可以下载&#xff08;就在这篇文章的开头也可以下…

深入MyBatis的动态SQL:概念、特性与实例解析

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。它可以使用简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff0c;即普通的 Java 对象为数据库中的记…

【数据结构与算法】:快速排序和冒泡排序

一&#xff0c;快速排序 快速排序是一种比较复杂的排序算法&#xff0c;它总共有4种实现方式&#xff0c;分别是挖坑法&#xff0c;左右"指针"法&#xff0c;前后"指针"法&#xff0c;以及非递归的快速排序&#xff0c;并且这些算法中也会涉及多种优化措施…

IntelliJ IDEA 2024.1 更新亮点汇总:全面提升开发体验

IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验 文章目录 IntelliJ IDEA 2024.1 更新亮点汇总&#xff1a;全面提升开发体验摘要引言 IntelliJ IDEA 2024.1 的新增功能主要亮点全行代码完成 最终的支持 Java 22 功能新航站楼 贝塔编辑器中的粘滞线 人工智能助…

Ubuntu 20.04.06 PCL C++学习记录(十八)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16 学习内容 PCL中实现欧式聚类提取。在点云处理中,聚类是一种常见的任务,它将点云数据划分为多…

Microbiome|北京林业大学生物多样性研究团队揭示土壤原核生物群落在推动亚热带森林植物多样性与生产力关系中的重要作用

生物多样性与生态系统功能&#xff08;BEF&#xff09;之间的关系是生态研究的重要课题之一。土壤微生物群落的变化可能是调节这种关系的关键因素之一。关于森林中真菌群落对树木多样性-生产力关系的影响&#xff0c;已有大量研究。然而&#xff0c;对于细菌和古细菌&#xff0…

第四届计算机、物联网与控制工程国际学术会议(CITCE 2024)

先投稿&#xff0c;先送审&#xff0c;先录用&#xff01;快至投稿后三天录用&#xff01; 第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024) The 4th International Conference on Computer, Internet of Things and Control Engineering&#xff08;CITCE…