最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年01月12日 08:41:58   作者:mkckr0  
這篇文章主要介紹了C++?使用?new?創(chuàng)建二維數(shù)組實(shí)例的相關(guān)資料,需要的朋友可以參考下

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)行釋放。

為什么可以這樣寫?因?yàn)檫@種多維數(shù)組和普通的多維數(shù)組都是通過一維數(shù)組實(shí)現(xiàn)的。例如,int a[6][8],實(shí)際上編譯器會轉(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]),因?yàn)樗侵羔様?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)存。

到此這篇關(guān)于C++ 使用 new 創(chuàng)建二維數(shù)組實(shí)例的文章就介紹到這了,更多相關(guān)C++ 使用 new 創(chuàng)建二維數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言怎么連接兩個數(shù)組的內(nèi)容你知道嗎

    C語言怎么連接兩個數(shù)組的內(nèi)容你知道嗎

    這篇文章主要為大家介紹了C語言怎么連接兩個數(shù)組的內(nèi)容,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • MFC之ComboBox控件用法實(shí)例教程

    MFC之ComboBox控件用法實(shí)例教程

    這篇文章主要介紹了MFC之ComboBox控件用法,包括了ComboBox控件常見的各類用法,非常具有實(shí)用價值,需要的朋友可以參考下
    2014-09-09
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[八]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[八]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[八]...
    2007-02-02
  • Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法

    Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法

    這篇文章主要介紹了Matlab制作視頻并轉(zhuǎn)換成gif動態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對來說比較簡單,需要的朋友可以參考下
    2018-08-08
  • opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能

    opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖片與視頻中人臉檢測功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++實(shí)現(xiàn)高精度加法

    c++實(shí)現(xiàn)高精度加法

    高精度運(yùn)算是指參與運(yùn)算的數(shù)(加數(shù),減數(shù),因子……)范圍大大超出了標(biāo)準(zhǔn)數(shù)據(jù)類型(整型,實(shí)型)能表示的范圍的運(yùn)算。例如,求兩個200位的數(shù)的和。這時,就要用到高精度算法了。
    2017-05-05
  • 詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式

    詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式

    本文主要介紹了QTreeWidget隱藏節(jié)點(diǎn)的兩種方式,一種是直接隱藏,一種是間接隱藏,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言鏈表實(shí)現(xiàn)貪吃蛇游戲

    C語言鏈表實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)貪吃蛇游戲源碼,適合C語言入門者學(xué)習(xí)閱讀,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C++超詳細(xì)梳理IO流操作

    C++超詳細(xì)梳理IO流操作

    當(dāng)程序與外界進(jìn)行信息交換時,存在兩個對象,一個是程序中的對象,另一個是文件對象。流是信息流動的一種抽象,它負(fù)責(zé)在數(shù)據(jù)的生產(chǎn)者和數(shù)據(jù)的消費(fèi)者之間建立聯(lián)系,并管理數(shù)據(jù)的流動
    2022-07-07
  • C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    C++ OpenCV單峰三角閾值法Thresh_Unimodal詳解

    本文主要介紹了適合當(dāng)圖像的直方圖具有明顯單峰特征時使用,結(jié)合了三角法的原理而設(shè)計(jì)的圖像分割方法,感興趣的小伙伴可以了解一下
    2021-12-12

最新評論

怀来县| 青神县| 安吉县| 新泰市| 丰县| 彰化县| 岳西县| 和政县| 广东省| 临泉县| 安仁县| 福海县| 武威市| 辽源市| 遂宁市| 安溪县| 民勤县| 黔西县| 工布江达县| 广宁县| 偏关县| 中山市| 中宁县| 武定县| 河北省| 镇安县| 唐山市| 宾阳县| 无棣县| 阳原县| 平谷区| 高雄县| 宿州市| 江都市| 安溪县| 阿瓦提县| 宾阳县| 襄垣县| 那坡县| 建始县| 孟州市|