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

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

或者

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

第二個寫法的錯誤訊息為

所以使用new的寫法是無法做出動態二維陣列了。
Modern C++一直希望大家用vector取代array,vector是否能達成動態建立二維陣列的需求呢?

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

執行結果


27行

就已經宣告出一個二維陣列啦,且初始值已經設為0,為什麼可以這樣寫呢?
首先我們利用的是vector of vector模擬二維陣列,所以型別為vector<vector<int> >,而vector有兩個constructor定義如下


第一個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行

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

傳遞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
《記憶體的配置》動態陣列