C ++, манипулировать 2d массивом - PullRequest
0 голосов
/ 01 декабря 2009

Я создал функцию для переворачивания квадратного двумерного массива по горизонтали, чтобы первый ряд перемещался в последний, второй ряд перемещался во второй из последнего и так далее.

Вот функция:

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 ]

3 голосов
/ 01 декабря 2009

Вы можете использовать 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, swap достаточно прост для реализации:

template <typename T>
void swap(T& pA, T& pB)
{
    T temp = pA;
    pA = pB;
    pB = temp;
}
1 голос
/ 01 декабря 2009

Если вы можете использовать другую структуру данных для представления матрицы, вы можете получить более эффективный алгоритм без использования STL.

Например, рассмотрите возможность использования массива указателей на список массивов, каждый из которых представляет строку матрицы. С этой структурой данных вам нужно только поменять указатель, если первый массив, и не нужно трогать элементы в списке массивов.

0 голосов
/ 01 декабря 2009

Копирование значений обратно в матрицу не приведет к копированию значений обратно в вызывающую сторону 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...