如何在C++中动态分配二维数组
生活随笔
收集整理的這篇文章主要介紹了
如何在C++中动态分配二维数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一般是三種方法:(1)用vector的vector,(2)先分配一個指針 數組,然后讓里面每一個指針再指向一個數組,這個做法的好處是訪問數組元素時比較直觀,可以用a[x][y]這樣的寫法,缺點是它相當于C#中的一個鋸齒 數組,內存空間不連續。(3)直接分配一個x*y大小的一維數組,這樣保證空間是連續的,但訪問數組元素不直觀。對于我這個“經典”回答,我那時還一直是 挺得意的,至少從蹭分的角度來看,這樣回答還是很有效的。?今天在ChinaUnix論壇閑逛時看到一個貼子,再次證明了我在C++方面才疏學淺。
#include <stdio.h>#include <stdlib.h>#include <string.h>void **darray_new(int row, int col, int size){ ? ? ? ?void **arr; ? ? ? ?arr = (void **) malloc(sizeof(void *) * row + size * row * col); ? ? ? ?if (arr != NULL) ? ? ? ?{ ? ? ? ? ? ? ? ?void *head; ? ? ? ? ? ? ? ?head = (void *) arr + sizeof(void *) * row; ? ? ? ? ? ? ? ?memset(arr, 0, sizeof(void *) * row + size * row * col); ? ? ? ? ? ? ? ?while (row--) ? ? ? ? ? ? ? ? ? ? ? ?arr[row] = head + size * row * col; ? ? ? ?} ? ? ? ?return arr;}void darray_free(void **arr){ ? ? ? ?if (arr != NULL) ? ? ? ? ? ? ? ?free(arr);}嗯,連續分配內存,而且可以用a[x][y]的方式來訪問!可謂二維數組動態分配的絕妙方法!這段程序是C的,似乎要改成支持對象分配的C++版也不是什么難事(不過估計得用上placement new吧,嗯,需要再思考一下……)。
2007-06-13 12:38 補充:
經過試驗,C++版出爐了:)關鍵點還是在于placement new和顯示的析構函數調用,用于保證對象可以正常的構造和析構。這個實現也還是有不少缺點的,比如,數組的大小必須記住,才能保證析構所有對象。不過這點可以通過改進分配方法算法,把數組大小也用一點空間保存起來。另一個缺點是,從語法上看,很容易讓人誤把darray_new返回的指針以為是數據區的起始地址,從而可能導致一些邏輯錯誤。
#include <iostream>#include <cstdlib>#include <new>
template <typename T>T **darray_new(int row, int col){int size = sizeof(T);void **arr = (void **) malloc(sizeof(void *) * row + size * row * col);if (arr != NULL){unsigned char * head;head = (unsigned char *) arr + sizeof(void *) * row;for (int i = 0; i < row; ++i){arr[i] = ?head + size * i * col;for (int j = 0; j < col; ++j)new (head + size * (i * col + j)) T;}}return (T**) arr;}
template <typename T>void darray_free(T **arr, int row, int col){for (int i = 0; i < row; ++i)for (int j = 0; j < col; ++j)arr[i][j].~T();if (arr != NULL)free((void **)arr);}
2007-06-13 21:00補充本文僅為技術層面的討論,實踐中考慮用boost::multi_array之類的現成的解決方案可能會更有效。?
#include <stdio.h>#include <stdlib.h>#include <string.h>void **darray_new(int row, int col, int size){ ? ? ? ?void **arr; ? ? ? ?arr = (void **) malloc(sizeof(void *) * row + size * row * col); ? ? ? ?if (arr != NULL) ? ? ? ?{ ? ? ? ? ? ? ? ?void *head; ? ? ? ? ? ? ? ?head = (void *) arr + sizeof(void *) * row; ? ? ? ? ? ? ? ?memset(arr, 0, sizeof(void *) * row + size * row * col); ? ? ? ? ? ? ? ?while (row--) ? ? ? ? ? ? ? ? ? ? ? ?arr[row] = head + size * row * col; ? ? ? ?} ? ? ? ?return arr;}void darray_free(void **arr){ ? ? ? ?if (arr != NULL) ? ? ? ? ? ? ? ?free(arr);}嗯,連續分配內存,而且可以用a[x][y]的方式來訪問!可謂二維數組動態分配的絕妙方法!這段程序是C的,似乎要改成支持對象分配的C++版也不是什么難事(不過估計得用上placement new吧,嗯,需要再思考一下……)。
2007-06-13 12:38 補充:
經過試驗,C++版出爐了:)關鍵點還是在于placement new和顯示的析構函數調用,用于保證對象可以正常的構造和析構。這個實現也還是有不少缺點的,比如,數組的大小必須記住,才能保證析構所有對象。不過這點可以通過改進分配方法算法,把數組大小也用一點空間保存起來。另一個缺點是,從語法上看,很容易讓人誤把darray_new返回的指針以為是數據區的起始地址,從而可能導致一些邏輯錯誤。
#include <iostream>#include <cstdlib>#include <new>
template <typename T>T **darray_new(int row, int col){int size = sizeof(T);void **arr = (void **) malloc(sizeof(void *) * row + size * row * col);if (arr != NULL){unsigned char * head;head = (unsigned char *) arr + sizeof(void *) * row;for (int i = 0; i < row; ++i){arr[i] = ?head + size * i * col;for (int j = 0; j < col; ++j)new (head + size * (i * col + j)) T;}}return (T**) arr;}
template <typename T>void darray_free(T **arr, int row, int col){for (int i = 0; i < row; ++i)for (int j = 0; j < col; ++j)arr[i][j].~T();if (arr != NULL)free((void **)arr);}
2007-06-13 21:00補充本文僅為技術層面的討論,實踐中考慮用boost::multi_array之類的現成的解決方案可能會更有效。?
轉載于:https://www.cnblogs.com/carekee/articles/1749558.html
總結
以上是生活随笔為你收集整理的如何在C++中动态分配二维数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法精解:C语言描述
- 下一篇: 如何编辑ttf字体文件