c++二维数组

来源:互联网 发布:js关闭iframe页面 编辑:程序博客网 时间:2024/06/06 06:30
这是我自己封闭的简单的二维数组模板类。欢迎大家试用

我用它来代替二维数组或二维vector(二维数组容易出错,二维vector效率太低)

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #ifndef DOUBLE_D_ARRAY  
  2. #define DOUBLE_D_ARRAY  
  3.   
  4. #include <string>  
  5. #include <iostream>  
  6. #include <cassert>  
  7. #include <cstdio>  
  8. using namespace std;  
  9.   
  10. //这是一个简单的二维数组的封装类,类似于二维的vector,是用一维数组实现的  
  11. //效率比较高,但不提供改变行数和列数的功能  
  12. template<class Type>  
  13. class DoubleDArray  
  14. {  
  15. private:  
  16.     bool m_HaveInit;        //判断该类是否已经初始化  
  17.     Type *m_Array;          //存放数据的数组  
  18.     int m_Row;              //行数  
  19.     int m_Column;           //列数  
  20.   
  21.     //将二维数据的行列转成一维数组的索引  
  22.     int GetIndex(int row, int column) const;  
  23.   
  24.     //清空数组(变成末初始化状态)  
  25.     void ClearArray();  
  26.   
  27.     //复制该数组  
  28.     void CloneArray(const DoubleDArray &array);  
  29.   
  30. public:  
  31.     DoubleDArray();  
  32.     DoubleDArray(int row, int column);  
  33.     DoubleDArray(const DoubleDArray &array);  
  34.     ~DoubleDArray();  
  35.     DoubleDArray &operator=(const DoubleDArray &array); // 赋值运算符    
  36.   
  37.     //初始化该数组, row,column分别是行数和列数  
  38.     void InitArray(int row, int column);  
  39.   
  40.     //设置和获取数据  
  41.     void SetValue(int row, int column, Type value);  
  42.     Type GetValue(int row, int column) const;  
  43. };  
  44.   
  45. template<class Type>  
  46. DoubleDArray<Type>::DoubleDArray()  
  47. {  
  48.     m_HaveInit = false;  
  49.     m_Array = NULL;  
  50.     m_Column = m_Row = 0;  
  51. }  
  52.   
  53. template<class Type>  
  54. DoubleDArray<Type>::DoubleDArray(int row, int column)  
  55. {  
  56.     DoubleDArray();  
  57.     InitArray(row, column);  
  58. }  
  59.   
  60. template<class Type>  
  61. DoubleDArray<Type>::DoubleDArray(const DoubleDArray<Type> &array)  
  62. {  
  63.     m_Array = NULL;  
  64.     CloneArray(array);  
  65. }  
  66.   
  67. template<class Type>  
  68. DoubleDArray<Type>::~DoubleDArray()  
  69. {  
  70.     ClearArray();  
  71. }  
  72.   
  73. template<class Type>  
  74. DoubleDArray<Type> &DoubleDArray<Type>::operator=(const DoubleDArray<Type> &array)  
  75. {  
  76.     ifthis != &array )  
  77.         CloneArray(array);  
  78.     return *this;  
  79.       
  80. }  
  81.   
  82. template<class Type>  
  83. int DoubleDArray<Type>::GetIndex(int row, int column) const  
  84. {  
  85.     assert(m_HaveInit);  
  86.     assert(column < m_Column);  
  87.     assert(row < m_Row);  
  88.     return row * m_Column + column;  
  89. }  
  90.   
  91. template<class Type>  
  92. void DoubleDArray<Type>::CloneArray(const DoubleDArray &array)  
  93. {  
  94.     ClearArray();  
  95.     if( !array.m_HaveInit )  
  96.         return;  
  97.     InitArray(array.m_Row, array.m_Column);  
  98.     int all = array.m_Row * array.m_Column;  
  99.     for(int i=0; i<all; i++)  
  100.         m_Array[i] = array.m_Array[i];  
  101. }  
  102.   
  103.   
  104. template<class Type>  
  105. void DoubleDArray<Type>::ClearArray()  
  106. {  
  107.     if( !m_HaveInit )  
  108.         return;  
  109.     m_HaveInit = false;  
  110.     m_Row = m_Column = 0;  
  111.     if( m_Array != NULL )  
  112.     {  
  113.         delete [] m_Array;  
  114.         m_Array = NULL;  
  115.     }  
  116. }  
  117.   
  118. template<class Type>  
  119. void DoubleDArray<Type>::InitArray(int row, int column)  
  120. {  
  121.     if( m_Array != NULL )  
  122.         delete [] m_Array;  
  123.     m_Array = new Type[row*column];  
  124.     m_HaveInit = true;  
  125.     m_Row = row;  
  126.     m_Column = column;  
  127. }  
  128.   
  129. template<class Type>  
  130. void DoubleDArray<Type>::SetValue(int row, int column, Type value)  
  131. {  
  132.     int index = GetIndex(row, column);  
  133.     m_Array[index] = value;  
  134. }  
  135.   
  136. template<class Type>  
  137. Type DoubleDArray<Type>::GetValue(int row, int column) const  
  138. {  
  139.     int index = GetIndex(row, column);  
  140.     return m_Array[index];  
  141. }  
  142.   
  143. #endif  
  144.   
  145. //测试例子  
  146. int main()  
  147. {  
  148.     DoubleDArray<int> dd;  
  149.     dd.InitArray(10, 10);  
  150.     for(int i=0; i<10; i++)  
  151.         for(int j=0; j<10; j++)  
  152.             dd.SetValue(i, j, i+j);  
  153.   
  154.     for(int i=0; i<10; i++)  
  155.     {  
  156.         for(int j=0; j<10; j++)  
  157.             printf("%d ", dd.GetValue(i, j));  
  158.         printf("\n");  
  159.     }  
  160.   
  161.     DoubleDArray<int> copy(dd);  
  162.     copy.SetValue(5, 5, 2345);  
  163.     printf("\n%d  %d\n", copy.GetValue(5, 5), dd.GetValue(5, 5));  
  164.     return 0;  
  165. }  
0 0