日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

C++?使用?new?創(chuàng)建二維數(shù)組實例_C 語言

作者:mkckr0 ? 更新時間: 2023-03-01 編程語言

1. 直接創(chuàng)建

C++ 使用 new 創(chuàng)建二維數(shù)組最直接的方法就是?new T[M][N]。返回的指針類型是?T (*)[N],它是指向數(shù)組的指針,可以直接使用數(shù)組下標(biāo)形式訪問元素。釋放內(nèi)存直接使用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;
}

執(zhí)行結(jié)果:

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 的構(gòu)造函數(shù)和析構(gòu)函數(shù)正常執(zhí)行。如果覺得?T (*)[N]?繁瑣,可以直接使用?auto p = new T[M][N]。三維數(shù)組甚至更高維數(shù)組都可以使用這種方法。例如,三維數(shù)組使用?new T[M][N][O]?進(jìn)行創(chuàng)建,依舊使用?delete[] p?進(jìn)行釋放。

為什么可以這樣寫?因為這種多維數(shù)組和普通的多維數(shù)組都是通過一維數(shù)組實現(xiàn)的。例如,int a[6][8],實際上編譯器會轉(zhuǎn)化為?int b[6 * 8]?一維數(shù)組。然后每次訪問二維數(shù)組?a[i][j]?相當(dāng)于訪問?b[i * 8 + j]。從二維、三維數(shù)組的轉(zhuǎn)化過程中可以發(fā)現(xiàn)一些規(guī)律。

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]

編譯器進(jìn)行下標(biāo)轉(zhuǎn)換時,并沒有用到第 0 維的大小,而其它維的大小都是必須的。這也就是為什么下面代碼能正確執(zhí)行。

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

由于多維數(shù)組本質(zhì)上是一維數(shù)組,所以釋放內(nèi)存都是?delete[] p,而沒有奇怪的?delete[][]?語法。

2. 借助指針數(shù)組

還有一種方法就是先?new T*[M]?創(chuàng)建一個指針數(shù)組,其每個元素保存每一行的首個元素的地址,再使用?new T[N]?創(chuàng)建每一行。示例代碼如下:

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]),因為它是指針數(shù)組而不是數(shù)組指針。其次,需要對每一行調(diào)用 new T[N]。釋放內(nèi)存時,要先使用?delete[]?釋放每一行,再調(diào)用?delete[]?釋放數(shù)組指針。這幾個步驟一步都不能錯,不然就出現(xiàn)野指針或者內(nèi)存泄漏。這段代碼我也是用 Address Sanitizer 和 Leak Sanitizer 檢查一遍才寫對。

這種方法唯一的好處就是可以創(chuàng)建交錯數(shù)組(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 對上面這種方法進(jìn)行包裝,使其更加易用。示例代碼如下:

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

這段代碼創(chuàng)建了一個二維數(shù)組,第 0 行有 3 個元素,第 1 行有 4 個元素。這種方法既能創(chuàng)建交錯數(shù)組,也不需要手動釋放內(nèi)存。

原文鏈接:https://www.cnblogs.com/mkckr0/p/17045233.html

欄目分類
最近更新