在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。

假设你的grid2d是一个围绕vector<vector<T> >的包装器,你可以传递一个值给resize,它将用来填充新创建的空间,所以当你添加一行时,你可以只传递当前的最后一行来复制到新的最后一行。

对于这个问题,你的代码在我看来相当复杂…我将使用

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,如果知道对象的内部结构,而不是使用公共的resize/get/set接口(例如,通过使makeOdd成为一个方法),这可能会更简单。

顺便说一下,在你的原始代码中,你正在复制一个指针的pTmp(不是原始对象);这也是没有意义的。

相关内容

  • 没有找到相关文章

最新更新