C++动态分配(new)二维数组的若干方法

写在前面

之前刷动态规划的题目,多需要用到二维数组(也许后面再优化成一维)。如果每次都按照给定数的范围直接声明为全局二维数组变量,又总觉得的不够优雅。查阅了一些网上的资料后,总结了一些使用方法,就写下这篇博文用以记录。

方法1——动态分配(new)一维数组,再强制类型转换为二维(个人使用,推荐指数:⭐⭐⭐⭐)

直接看例子

/** 假设需要根据两个string的长度建立二维数组 */
const int sz1 = str1.size(); 
const int sz2 = str2.size(); 

/** 动态分配内存 */
auto f = new int[sz1 * sz2];
auto dp = (int (*)[sz2])f;

/** 这里放置自己制造bug的操作*/
// abaabaaba, 直接dp[i][j]使用即可

/** 制造完了别忘记释放栈空间 */
delete[] f;
f = nullptr;
dp = nullptr;

注意,auto dp = (int (*)[sz2]f这条语句,sz2的大小一定要是后面使用二维数组时最低维的大小
如果按照上面的类型转换方式,下面这样写会出现bug(注意sz1和sz2的顺序):

for (int i = 0; i < sz2; ++i)
  for (int j = 0; j < sz1; ++j)
    // do something; 
    /** 其实大概率你啥也do不了,程序跑飞了 */

这个方法优点和缺点都很明显,灵活、完全和使用全局二维数组方法一样,且释放内存简单,但是使用存在危险性。如果觉得自己把握不住,建议先考虑其他方法。


另外,请读者考虑一下,可以使用如下的二重指针代替一维数组的指针进行类型转换吗?

auto f = new int[sz1 * sz2];
auto dp = (int **)f; /** 二重指针真的可以吗?*/

若觉得可行的话,可能对二维数组和二重指针的理解出现了偏差。试想,我们按照dp存储的地址值a去寻址,得到地址a中存储的值b,再按照值b去寻址的话会发生什么?(本例中,b的值的根本不是地址,而是数组的值!)

C++动态分配(new)二维数组的若干方法

我们思考后也不难理解,为什么声明二维数组的形参类型或者是强制类型转换时,一定要正确指定最低维的大小。

方法2——分配一维数组,以二维数组的方式使用(推荐指数:⭐⭐⭐)

其实如果不是非要追求“传统”的使用二维数组的方式,也可以不用强制类型转换的方法。

只需要把握一点:二维数组的所有元素,在内存中是连续排列的。

那么我们可以按照如下的方式使用分配的二维数组:

/** 假设需要根据两个string的长度建立二维数组 */
const int sz1 = str1.size(); 
const int sz2 = str2.size(); 

/** 动态分配内存 */
auto f = new int[sz1 * sz2];

/** 给每个元素赋值 */
for (int i = 0, idx = 1; i < sz1; ++i)
    for (int j = 0; j < sz2; ++j, ++idx)
        f[i * sz2 + j] = idx; /** 相当于 arr[i][j] = idx; */

/** 别忘记释放堆空间 */
delete[] f;
f = nullptr;

与方法一大同小异,因此注意事项也一样,注意f[i * sz2 + j]中sz2是最低维的大小。

方法3——多次动态分配(也需要多次释放)(推荐指数:⭐⭐)

简单说,就是动态分配一维数组,然后把这些数组的指针存储到一个数组元素为一维数组的数组中。
代码如下:

/** 假设需要根据两个string的长度建立二维数组 */
const int sz1 = str1.size(); 
const int sz2 = str2.size(); 

/** 分配一个数组元素为一维数组的数组 */
auto dp = new int *[sz1];

/** 给数组每个元素赋值 */
for (int i = 0; i < sz1; ++i)
  dp[i] = new int[sz2];

/** 这里放置自己制造bug的操作*/
// abaabaaba

/** 制造完了别忘记释放堆空间 */
for (int i = 0; i < sz1; ++i)
  delete[] dp[i];

delete[] dp;

注意最后要先释放元素的内存。

(小声说,应该很少有人用这种方法?)

方法4——使用vector(推荐指数:⭐⭐⭐⭐⭐)

前面的几种方法多少是不太 idiomatic C++,最后当然要请出我们的STL。

没什么说的,直接看代码:

vector<vector<int> > dp(str1.length(), vector<int>(str2.length(), 0));

优点是不用再担心内存释放的问题,并且vector有很多方便的成员函数可以使用。

另外,在刷题的时候如果要判断二维vector是否为空,可以使用如下语句:

if (dp.empty() || dp[0].empty()) 
  return ;

原文链接:https://www.cnblogs.com/yang5sui/p/17311997.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++动态分配(new)二维数组的若干方法 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • Qt-FFmpeg开发-音频解码为PCM文件(9)

    音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 目录 音视频/FFmpeg #Qt Qt-FFmpeg开发-使用libavcodec API的音频解码示例(MP3转pcm) 1、概述 2、实现效果 3、主要代码 4、完整源代码 更多精彩内容 ?个人内容分类汇总 ? ?音视频开发 ? 1、…

    C++ 2023年4月17日
    00
  • 高效c语言1快速入门

    本章将开发你的第一个C语言程序:传统的 “Hello, world!”程序。然后讨论一些编辑器和编译器的选项,并阐述移植性问题。 Hello, world! #include <stdio.h> #include <stdlib.h> int main(void) { puts(“Hello, world!”); return EXI…

    C++ 2023年5月10日
    00
  • 面试最常问的数组转树,树转数组 c++ web框架paozhu实现

    刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这种功能 二维数组转树,树转二维数组 保存时候树二维数组,展示时候树树状。 这个技术难点在于无限递归,这个树程序基本原理 现在看看c++怎么实现的,无限递归,家肯…

    C++ 2023年4月25日
    00
  • 13、c++使用单例模式实现命名空间函数

    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace(); 声明命名空间及函数 namespace test{ const std::string& getName()和(); const std::string& getNameSpace(); } 命名空间内实现单例类 实现一个单例类,…

    C++ 2023年4月24日
    00
  • 内存淘汰策略|页面置换算法对比总结

    在学习【操作系统】 【MySQL】【Redis】后,发现其都有一些缓存淘汰的策略,因此一篇小文章总结一下。 目前还没着笔,初略一想MySQL和操作系统应该都是使用的年轻代和老生代的改进策略,而Redis使用的是随机抽的策略。 MySQL MySQL中存在一个内存缓存池,Buffer Pool。里面存在着控制块和缓存的数据页(当然还有些其他缓存,比如:锁信息、…

    C++ 2023年4月18日
    00
  • QML和QT

    推荐一些学习qml教程 Qt官方的QML教程: https://doc.qt.io/qt-5/qtqml-index.html这是一个由Qt官方提供的完整的QML教程,包含了所有基本知识和高级语法。 QML中文网:http://www.qmlcn.com/这是一个非常不错的中文QML学习网站,提供了丰富的例子和教程,而且有很多QML爱好者在这里交流。 《Qt…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】库的 22 个 API 使用说明

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇主要介绍 VLD 库提供的 22 个外部接口。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 头文件简介 2. 文件 vld_def.h 简介 3. 文件 vld.h 简介 3.1 接口 VLDDisable 3.2 接口 VLDEnable 3.3 接口 VLDRestore…

    C++ 2023年4月17日
    00
  • 记一次 腾讯会议 的意外崩溃分析

    一:背景 1. 讲故事 前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈???,有了这个好奇心,也有了这个 dump,接下来用 windbg 看一看…

    C++ 2023年4月22日
    00
合作推广
合作推广
分享本页
返回顶部