(原創) 如何動態建立二維陣列(多維陣列)? (C/C++)

來源:互聯網
上載者:User

在(原創) 如何動態建立二維陣列(多維陣列)? (高級) (C)中,我們看到用C語言動態建立二維陣列並不是件容易的事情,但在C++有沒有更好的解法呢?

在(原創) 如何動態建立一維陣列? (初級) (C/C++) 中,我們看到C++動態建立一維陣列的的寫法為

int *ia = new int[sizex];

根據以往的經驗,預期二維的寫法為

int **ia = new int[sizey][sizex];

或者

int *ia[sizex] = new int[sizey][sizex];

但這兩種寫法compiler都不能過,第一個寫法的錯誤訊息為

cannot convert from 'int (*)[3]' to 'int **'

第二個寫法的錯誤訊息為

cannot convert from 'int (*)[3]' to 'int *[3]'

所以使用new的寫法是無法做出動態二維陣列了。

Modern C++一直希望大家用vector取代array,vector是否能達成動態建立二維陣列的需求呢?

 1/**//* 
 2(C) OOMusou 2007 http://oomusou.cnblogs.com
 3
 4Filename    : ArrayDynamicTwoDim_vector.cpp
 5Compiler    : Visual C++ 8.0 / BCB 6.0 /gcc 3.4.2 / ISO C++
 6Description : Demo how to dynamic allocate 2 dim array on heap by vector
 7Release     : 02/25/2007 1.0
 8              02/28/2007 2.0
 9*/
10#include <iostream>
11#include <vector>
12#include "conio.h"
13
14using namespace std;
15
16void printTwoDimDynamicArray(vector<vector<int> > ivec) {
17  for(int y = 0; y != ivec.size(); ++y) {
18    for(int x = 0; x != ivec[0].size(); ++x) {
19      cout << ivec[y][x] << " ";
20    }
21    cout << endl;
22  }
23}
24
25int main() {
26  const int sizex = 3;
27  const int sizey = 2;
28  vector<vector<int> > ivec(sizey, vector<int>(sizex));
29  
30  for(int y = 0; y != sizey; ++y) {
31    for(int x = 0; x != sizex; ++x) {
32      ivec[y][x] = y + x;
33    }
34  }
35  
36  printTwoDimDynamicArray(ivec);
37  
38  getch();
39}

執行結果

0 1 2
1 2 3

27行

vector<vector<int> > ivec(sizey, vector<int>(sizex));

就已經宣告出一個二維陣列啦,且初始值已經設為0,為什麼可以這樣寫呢?

首先我們利用的是vector of vector模擬二維陣列,所以型別為vector<vector<int> >,而vector有兩個constructor定義如下

vector<Elem> c(n,elem)
vector<Elem> c(n)

第一個constructor的意義為建立一個大小為n的vector,且每個element為elem。
第二個constructor的意義為建立一個大小為n的vector,且每個element初始值為0。

根據第一個constructor,我們定義出大小為sizey的vector,且每個element為vector<int>(sizex),根據第二個constructor,第二個vector大小為sizex,且初始值為0,這樣合起來就剛好是vector of vector,模擬出二維陣列了。

31行

ivec[y][x] = y + x;

成功的使用了二維陣列subscripting的寫法了!!

16行

void printTwoDimDynamicArray(vector<vector<int> > ivec)

傳遞vector進function時,不再使用pointer,用的是vector<vector<int> >型別,而且連sizey,sizex的參數也不用傳了。

使用vector的另外一個優點,不用再擔心如何釋放陣列,也不會再有memory leak了。

Conclusion
透過vector的確成功了模擬出二維陣列,且不難理解,若你的環境允許使用C++,強烈建議改用C++寫法。

See Also
(原創) 如何動態建立二維陣列(多維陣列)? (高級) (C)
(原創) 如何動態建立一維陣列? (初級) (C/C++)
(原創) 由一維陣列模擬二維陣列(多維陣列) (中級) (C/C++)
(原創) 如何動態建立二維陣列(多維陣列)? (初級) (C#)

Reference
C++標準程式庫 6.2.2 vector的操作函式 p.150
《記憶體的配置》動態陣列

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.