在C ++中使多维数组奇数维的最佳方法?

| 我编写了以下函数,通过根据需要添加行或列来使二维数组对象成为奇数维(其中sizeX,sizeY,get,set和resize是不言自明的grid2D成员函数)。
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;
    }

}
我的问题:是否有一种更清洁/更有效的方法? 非常感谢...     
已邀请:
我认为先检查行数,然后根据需要将其扩展为1会更容易。然后,检查列数,并根据需要将每个列扩展1。 假设您的ѭ1是ѭ2的包装,您可以将值传递给
resize
,它将用于填充新创建的空间,因此,当您添加一行时,您只需传递当前的最后一行即可将其复制到新的last中行。     
对于此问题,您的代码对IMO来说是很复杂的...我会这样做
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));
    }
}
当然,根据ѭ5,如果知道对象的内部结构而不是使用公共的调整大小/获取/设置接口(例如通过使making6成为方法),则可能会更简单。 顺便说一下,在原始代码中,您正在复制指针(不是原始对象)的副本
pTmp
;这也没有意义。     

要回复问题请先登录注册