2011-05-02 60 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