C ++,操纵2d数组

时间:2009-12-01 04:32:44

标签: c++ pointers

我创建了一个水平翻转方形2d数组的函数,因此第一行移动到最后一行,第二行移动到最后一行,依此类推。

这是功能:

void flipMatrix(int size, int matrix[ROWS][COLS]) {
    int row, col;

    int temp[ROWS][COLS];

    for (row=0; row < size; row++) {
        for (col=0; col < size; col++) {
            temp[(size - 1)-row][col] = matrix[row][col];
        }
    }

    //A simple function that copies the temp array to matrix, so that  
    //I can then print the matrix array
    copyArray(size, matrix, temp);
}

我知道这是非常低效的,但我对C ++很陌生。我想知道如何通过返回指针来调整它以提高效率?我也想知道是否有办法在不创建临时数组的情况下执行此操作?

我还应该注意,我试图在不使用STL的情况下这样做。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用std::swap并只是就地交换值:

void flipMatrix(int size, int matrix[ROWS][COLS])
{
    for (int row = 0; row < ROWS; ++row)
    {
        for (col=0; col < COLS / 2; ++col) // half the column, lest you undo it
        {
            std::swap(matrix[ROWS - row - 1][col], matrix[row][col]);
        }
    }
}

交换在<algorithm>中定义。如果你真的不能使用STL,交换很简单就可以实现:

template <typename T>
void swap(T& pA, T& pB)
{
    T temp = pA;
    pA = pB;
    pB = temp;
}

答案 1 :(得分:1)

如果您可以使用不同的数据结构来表示矩阵,则可以在不使用STL的情况下获得更高效的算法。

例如,考虑使用指向数组列表的指针数组,每个数组表示一个矩阵行。使用此数据结构,您只需要在第一个数组中交换指针,而不需要触及数组列表中的项目。

答案 2 :(得分:0)

将值复制回矩阵不会将值复制回flipMatrix的调用者,因为已知大小的数组(此处为ROWS x COLS)按值传递:

void copyReverse(int a[4]) { ... }
void refReverse(int a[], int size) { ... }

int a[4] = { 1, 2, 3, 4 };
copyReverse(a);
// a = { 1, 2, 3, 4 } still.
refReverse(a, 4); // Doesn't know size from type
// a = { 4, 3, 2, 1 }

因此,结合GMan的答案,扩大交换:

void flipMatrix(int size, int matrix[][])
{
    for (int row = 0; row < size; ++row)
    {
        for (col=0; col < size / 2; ++col)
        {
            int temp = matrix[size - row - 1][col];
            matrix[size - row - 1][col] = matrix[row][col];
            matrix[row][col] = temp;
        }
    }
}