返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ 使用 new 创建二维数组实例
  • 740
分享到

C++ 使用 new 创建二维数组实例

摘要

目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 c++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针

1. 直接创建

c++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针类型是 T (*)[N],它是指向数组的指针,可以直接使用数组下标形式访问元素。释放内存直接使用delete[]。示例代码:

#include <iOStream>

class A
{
public:
    A()
    {
        std::cout << "A::A" << std::endl;
    }
    ~A()
    {
        std::cout << "A::~A" << std::endl;
    }

    int x;
};

int main()
{
    A (*p)[3] = new A[2][3];
    delete[] p;
}

执行结果:

A::A
A::A
A::A
A::A
A::A
A::A
A::~A
A::~A
A::~A
A::~A
A::~A
A::~A

可以看到 A 的构造函数和析构函数正常执行。如果觉得 T (*)[N] 繁琐,可以直接使用 auto p = new T[M][N]。三维数组甚至更高维数组都可以使用这种方法。例如,三维数组使用 new T[M][N][O] 进行创建,依旧使用 delete[] p 进行释放。

为什么可以这样写?因为这种多维数组和普通的多维数组都是通过一维数组实现的。例如,int a[6][8],实际上编译器会转化为 int b[6 * 8] 一维数组。然后每次访问二维数组 a[i][j] 相当于访问 b[i * 8 + j]。从二维、三维数组的转化过程中可以发现一些规律。

T a[M][N] 	 --> T b[M * N],  	 a[i][j]    --> b[i * N + j]
T a[M][N][O] --> T b[M * N * O], b[i][j][k] --> b[i * N * O + j * O + k]

编译器进行下标转换时,并没有用到第 0 维的大小,而其它维的大小都是必须的。这也就是为什么下面代码能正确执行。

int a[2][3];
int (*p)[3] = a;

由于多维数组本质上是一维数组,所以释放内存都是 delete[] p,而没有奇怪的 delete[][] 语法。

2. 借助指针数组

还有一种方法就是先 new T*[M] 创建一个指针数组,其每个元素保存每一行的首个元素的地址,再使用 new T[N] 创建每一行。示例代码如下:

A** p = new A*[2];
for (int i = 0; i < 2; ++i) {
    p[i] = new A[3];
}

for (int i = 0; i < 2; ++i) {
    delete[] p[i];
}
delete[] p;

这种方法非常繁琐,首先 new T*[M] 不能写成 new (T(*)[M]),因为它是指针数组而不是数组指针。其次,需要对每一行调用 new T[N]。释放内存时,要先使用 delete[] 释放每一行,再调用 delete[] 释放数组指针。这几个步骤一步都不能错,不然就出现野指针或者内存泄漏。这段代码我也是用 Address Sanitizer 和 Leak Sanitizer 检查一遍才写对。

这种方法唯一的好处就是可以创建交错数组(Jagged Array),也就是每一行的大小不一样。例如:

A **p = new A *[2];
p[0] = new A[3];
p[1] = new A[4];

for (int i = 0; i < 2; ++i)
{
    delete[] p[i];
}
delete[] p;

3. 借助 std::vector

可以用 std::vector 对上面这种方法进行包装,使其更加易用。示例代码如下:

std::vector<std::vector<int>> v{ std::vector<int>(3), std::vector<int>(4) };
std::cout << v[0].size() << " " << v[1].size() << std::endl;

这段代码创建了一个二维数组,第 0 行有 3 个元素,第 1 行有 4 个元素。这种方法既能创建交错数组,也不需要手动释放内存。

到此这篇关于C++ 使用 new 创建二维数组实例的文章就介绍到这了,更多相关C++ 使用 new 创建二维数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ 使用 new 创建二维数组实例

本文链接: https://lsjlt.com/news/177449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++ 使用 new 创建二维数组实例
    目录1. 直接创建2. 借助指针数组3. 借助 std::vector1. 直接创建 C++ 使用 new 创建二维数组最直接的方法就是 new T[M][N]。返回的指针...
    99+
    2023-01-12
    c++用new创建二维数组 C++使用new语句生成二维数组 c++ new二维数组
  • Python 用NumPy创建二维数组的案例
    前言 上位机实战开发先放一放,今天来学习一个新的内容—NumPy的使用 1 一维数组 例:用普通方法生成一维数组 num = [0 for i in range(1,5)] # ...
    99+
    2024-04-02
  • Python 创建二维数组
    文章目录 一. 创建二维数组遇到的问题1. 列表能创建多维数组? 二. 解决:使用列表创建一个二维数组,可以使用生成器来辅助实现三. 解决:相比 List,NumPy 数组的优势1. ...
    99+
    2023-09-22
    python numpy 开发语言
  • Android二维码创建实例
    Android二维码之创建 实现效果图: 1.Android 有自带的jar包可以生成二维码core-3.0.0.jar,其中的com.google.zxing包 2.写一个...
    99+
    2022-06-06
    Android
  • c语言怎么创建二维动态数组
    c 语言中创建二维动态数组需要以下步骤:分配行指针数组为每一行分配内存通过指针解引用访问和操作数组元素 C 语言创建二维动态数组 二维动态数组是指在运行时动态分配内存的二维数组。创建二...
    99+
    2024-05-23
    c语言
  • python怎么创建二维数组
    在Python中,我们可以使用列表嵌套的方式来创建二维数组。具体步骤如下: 首先创建一个空的列表,表示二维数组。 使用嵌套的for...
    99+
    2023-10-22
    python
  • Python创建二维数组与初始化的实践举例
    目录一、Python用什么表达二维数组二、如何初始化一个二维数组2.1 利用list自身进行构造2.2 利用传统的list的append方法,通过迭代构造2.3利用numpy包构建二...
    99+
    2022-12-10
    python创建二维数组并赋值 python如何定义二维数组 python二维数组创建
  • C#二维数组与多维数组如何使用
    这篇文章主要介绍“C#二维数组与多维数组如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#二维数组与多维数组如何使用”文章能帮助大家解决问题。C# 中同样支持多维数组(也可称为矩形数组),它...
    99+
    2023-07-05
  • PHP中如何创建二维数组
    这篇文章给大家分享的是有关PHP中如何创建二维数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。所谓的二维数组,简单来说就是在一维数组里面再定义多个一维数组,即一个数组中的值可以是另一个数组(可能有点片面,但是二...
    99+
    2023-06-20
  • python中怎么用numpy创建二维数组
    你可以使用numpy的`array`函数来创建二维数组。以下是一个使用numpy创建二维数组的示例代码:```pythonimpor...
    99+
    2023-08-31
    python numpy
  • Python创建二维数组实例(关于list的一个小坑)
    0.目录 1.遇到的问题 2.创建二维数组的办法 •3.1 直接创建法 •3.2 列表生成式法 •3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的...
    99+
    2022-06-04
    数组 实例 Python
  • C#二维数组与多维数组的具体使用
    目录1、二维数组2、初始化二维数组3、访问二维数组种的元素C# 中同样支持多维数组(也可称为矩形数组),它可以是二维的,也可以是三维的,多维数组中的数据以类似表格(行、列)的形式存储...
    99+
    2023-05-15
    C#二维数组与多维数组 C#二维数组 C#多维数组
  • c++利用vector创建二维数组的几种方法总结
    目录用vector创建二维数组的几种方法方法一方法二:一维扩充法 vector定义二维数组的输入和输出用vector创建二维数组的几种方法 方法一 #include <...
    99+
    2022-11-13
    c++ vector vector创建二维数组 c++二维数组
  • C++中如何使用二维数组
    C++中如何使用二维数组,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C++二维数组new应用方式一:A (*ga)[n] = new&nbs...
    99+
    2023-06-17
  • C语言如何实现二维数组的创建和初始化
    这篇文章给大家分享的是有关C语言如何实现二维数组的创建和初始化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。二维数组的创建和初始化1二维数组的创建int arr[3][...
    99+
    2024-04-02
  • JavaScript中二维数组的创建技巧
    Js中二维数组的创建: 首先JavaScript只支持 一维数组 ,但我们可以通过一些方法实现矩阵以及多维数组 其中普通的创建方法并不会出现什么问题: (1) 利用一维数组嵌套一维数...
    99+
    2024-04-02
  • java创建二维数组怎么排序
    要对二维数组进行排序,可以使用Arrays类中的sort()方法来实现。下面是一个示例代码,演示如何对二维数组进行排序: impor...
    99+
    2024-03-07
    java
  • PHP开发技术:如何使用二维码生成器创建二维码数组?
    随着移动互联网的飞速发展,二维码已经成为一种非常方便的信息传递方式,因为它可以存储大量的信息,并且可以在移动设备上方便地扫描和识别。在PHP开发中,我们可以使用二维码生成器来创建二维码数组,本文将介绍如何使用PHP二维码生成器来创建二维码...
    99+
    2023-06-02
    开发技术 二维码 数组
  • 如何使用C++数组指针和二维数组
    这篇文章主要介绍“如何使用C++数组指针和二维数组”,在日常操作中,相信很多人在如何使用C++数组指针和二维数组问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用C++数组指针和二维数组”的疑惑有所帮助!...
    99+
    2023-06-25
  • chatgpt赋能python:Python如何创建二维数组
    Python如何创建二维数组 在Python编程中,经常需要使用到二维数组,它是一个由多个一维数组组成的数组。本篇文章将介绍Python如何创建二维数组,包括几种常用方法。 方法一:使用list和fo...
    99+
    2023-09-03
    python chatgpt numpy 计算机
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作