2011-05-02 58 views
1

我寫了下面的函數,通過根據需要添加行或列(其中sizeX,sizeY,get,set和resize是自解釋的grid2D成員函數)來創建奇數維的二維數組對象。在C++中創建多維數組的奇怪維度的最佳方法?

void makeOdd(grid2D<double> *pSrc) 
// --------------------------------------------------------------------------------------------------------- 
// Make one or both dimensions of input array odd (via row/column copy). 
{ 

    // Variable declarations 
    grid2D<double> pTmp = *pSrc;        // Scratch local source variable 
    int simax, sjmax;            // Source dimensions 

    // Get source dimensions 
    sjmax = pSrc->sizeY(); 
    simax = pSrc->sizeX(); 

    // Check if source is already odd-dimensioned 
    if (sjmax%2 && simax%2) return; 

    // Extend row/column of source if necessary 
    if (sjmax%2 && !(simax%2))          // Odd rows, even columns 
    { 
     pSrc->resize(simax+1,sjmax);        // Resize source with extra column 
     for(int i=0; i<simax+1; i++) 
     { 
      for(int j=0; j<sjmax; j++) 
      { 
       if(i==simax) 
        pSrc->set(i,j,pTmp.get(simax-1,j));    // Copy last column 
       else 
        pSrc->set(i,j,pTmp.get(i,j)); 
      } 
     } 
     return; 
    } 
    else if (!(sjmax%2) && simax%2)         // Even rows, odd columns 
    { 
     pSrc->resize(simax,sjmax+1);        // Resize source with extra row 
     for(int i=0; i<simax; i++) 
     { 
      for(int j=0; j<sjmax+1; j++) 
      { 
       if(i==simax) 
        pSrc->set(i,j,pTmp.get(i,sjmax-1));    // Copy last row 
       else 
        pSrc->set(i,j,pTmp.get(i,j)); 
      } 
     } 
     return; 
    } 
    else               // Even rows, even columns 
    { 
     pSrc->resize(simax+1,sjmax+1);        // Resize source with extra row and column 
     for(int i=0; i<simax+1; i++) 
     { 
      for(int j=0; j<sjmax+1; j++) 
      { 
       if(i==simax && j==sjmax) 
       { 
        pSrc->set(i,j,pTmp.get(simax-1,sjmax-1));  // Copy last column and row 
       } 
       else if(i==simax && j<sjmax) 
       { 
        pSrc->set(i,j,pTmp.get(simax-1,j));    // Copy last column 
       } 
       else if(i<simax && j==sjmax) 
       { 
        pSrc->set(i,j,pTmp.get(i,sjmax-1));    // Copy last row 
       } 
       else 
       { 
        pSrc->set(i,j,pTmp.get(i,j)); 
       } 
      } 
     } 
     return; 
    } 

} 

我的問題:是否有這樣做的更清潔/更有效的方式?

非常感謝......

+0

你究竟想在這裏做什麼? – 2011-05-02 05:50:39

+0

例如,如果我有一個尺寸爲10x10的雙數組X,我想通過複製最後一行和一列來創建新尺寸來使X具有尺寸11x11。 – Evan 2011-05-02 06:21:28

回答

1

,我認爲它會更容易首先檢查的行數,並在必要時由1擴展它。然後,檢查列的數量,並根據需要擴展它們中的每一個。

假設你grid2dvector<vector<T> >周圍的包裝,可以將值傳遞給resize,它用來填充新創建的空間,所以當你添加行,你可以通過電流最後一行把它複製進入新的最後一行。

+0

謝謝傑裏,這是很好的建議... – Evan 2011-05-02 06:12:52

1

你的代碼是國際海事組織對於這個問題相當令人費解......我會做的,而不是

void makeOdd(grid2D<double> *pSrc) 
{ 
    int ny = pSrc->sizeY(); 
    int nx = pSrc->sizeX(); 
    int oddnx = nx + (nx % 2 == 0); 
    int oddny = ny + (ny % 2 == 0); 
    if (nx != oddnx || ny != oddny) 
    { 
     pSrc->resize(oddnx, oddny); 
     if (nx != oddnx) 
      for (int y=0; y<ny; y++) 
       pSrc->set(nx, y, pSrc->get(nx-1, y)); 
     if (ny != oddny) 
      for (int x=0; x<oddnx; x++) 
       pSrc->set(x, ny, pSrc->get(x, ny-1)); 
    } 
} 

當然取決於grid2D這可能可能是更簡單的,如果知道物體的內部結構,而不是使用公共調整大小/獲取/設置界面(例如通過製作makeOdd的方法)。

順便說一句,在您的原始代碼中,您正在製作一個指針(不是原始對象)的複製pTmp;這也沒有意義。

+0

嗨6502,非常感謝您的乾淨和簡潔的代碼!至於你的第二點,我在grid2D中定義了「=」運算符來將rhs memcpy放入一個新的T(double here)容器中,這樣操作並不是毫無意義的。 – Evan 2011-05-03 05:30:24

+0

對不起,我誤解了你的代碼,並認爲你只是做了一個指針的副本(當然你不能重載指針賦值)。如果調整大小操作的目的是保留當前內容(如IMO應該那樣),則不需要複製:您可以調整大小並將第二個最後一列/行的元素複製到最後一個。 – 6502 2011-05-03 06:36:57

+0

您好6502,再次感謝您的回覆。在我的「resize」grid2D成員函數中,我刪除了容器並分配了新的指定大小的容器。你如何建議這樣做來保存原始內容? – Evan 2011-05-03 07:03:25