coco
版主

註冊日期: Sep 2002
居住地:
共發表: 1681 篇文章 |
本主題第 3 篇文章
自製了一個可多維的動態陣列類別
這是一個粗糙的陣列類別,可執行時期決定陣列大小,但不能隨便擴充大小。
(當然有必要的話,你可以很容易的加上可擴充大小的功能)
寫這個程式目的純供學習如何在C++中用類別和運算子覆載來模擬多維陣列。
所以一些不相關的但也許很有用的功能都不放進來(例如泛型指標),以求程式
乾淨易於重點閱讀。
真正的應用,STL 的 vector 會有更多的擴充功能和使用彈性。
這個程式只是供學習和理解像 vector 模擬多維陣列,且在建構
時就已保留好所需的陣列空間是如何運作的。
code:
template <class T>
class CArray{
int m_sz;
T *m_pData;
public:
//copy constructor:由於 m_pData是new出來的,
//default copy constructor 不能使用,所以得要自製
CArray(const CArray<T>& src){*this= src;}
//建構子: n 是陣列的大小,d 是陣列內容的起始值
//要模擬成二維,d 參數的引入是重要關鍵(詳見二維應用範例)
CArray(int n=0, const T& d= T()){
m_sz=n;
//注意二維以上時,T 可能會是CArray 類別,new T[m_sz]會喚起
//CArray()預設建構子。而預設建構子是由本建構式來提供
if (m_sz) m_pData= new T[m_sz];
else m_pData=NULL;
for (int i=0;i<n;i++)
m_pData[i]=d;
//模擬二維以上時,T可能為CArray型態,這時這裡的
//m_pData[i]=d會呼叫 CArray<T>& operator =()
}
//解構子,就不用說明了吧!
~CArray(){
if (m_pData) delete [] m_pData;}
//二維以上模擬時會用到
const CArray<T>& operator =(const CArray<T>& src){
if (m_pData){
delete [] m_pData;
m_pData=NULL;
}
m_sz= src.m_sz;
if (m_sz){
m_pData= new T[m_sz];
//三維以上時 T 可能為 CArray型態,new T[m_sz]會喚起 CArray()
for (int i=0; i<m_sz; i++)
m_pData[i]=src.m_pData[i];
}
return *this;
}
//下標運算子的重載
T& operator[](int i){return m_pData[i];}
const T& operator[](int i)const {return m_pDtat[i];}
};
//應用範例
void main()
{
int i,j,k;
int m=2,n=3, o=4;
// 一維使用範例
CArray<int> Array1D(m);//相當於 int Array1D[m]
for (i=0;i <m; i++)
Array1D[i]=i;
for (i=0;i <m; i++)
cout<<Array1D[i]<<endl;
//二維使用範例
CArray<CArray<int> > Array2D(m,CArray<int>(n));//相當於 int Array2D[m][n]
for (i=0; i<m;i++){
for (int j=0; j<n;j++){
Array2D[i][j]=i*10+j;
}
}
for (i=0; i<m;i++){
for (j=0; j<n;j++){
cout<<Array2D[i][j]<<endl;
}
}
//三維使用範例
CArray<CArray<CArray<int> > > Array3D(m,CArray<CArray<int> >(n,CArray<int>(o)));//相當於 int Array3D[m][n][o]
for (i=0; i<m;i++){
for (j=0; j<n;j++){
for (k=0; k<o;k++){
Array3D[i][j][k]=i*100+j*10+k;
}
}
}
for (i=0; i<m;i++){
for (j=0; j<n;j++){
for (k=0; k<o;k++){
cout<<Array3D[i][j][k]<<endl;
}
}
}
}
良心的提醒:
當你用用像vector或CArray類別物件當引數傳給函式時,最好以
reference來傳,否則當陣列物件很大時會有可怕的陣列複製發生!
例如:
void func1D(CArray<int> &A);//一維的傳遞
void func2D(CArray<CArray<int> > &A);//二維的傳遞
這時和真正的指標一樣,改變了A的內容也會改變呼叫引數
的內容。
coco 在 05-27-2003 02:43 PM 編輯
反應文章 | IP: 已經記錄
|