2009-12-01 4 views
0

Я создал функцию для перевода квадратного 2-мерного массива по горизонтали, поэтому первая строка перемещается до последней, вторая строка перемещается во вторую от последней и так далее.C++, манипулировать 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.

Спасибо за помощь.

+0

Я предполагаю, что 'size' вы имеете в виду' ROWS' или 'COLS'? – GManNickG

+0

Да, если размер = 5, то ROWS = 5 и COLS = 5. – Joe

+0

Кажется нелогичным передавать оба ROWS/COLS вместе с размером. – GManNickG

ответ

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; 
} 
+0

После заполнения половины матрицы не будут ли они повторяться одни и те же значения? – Naveen

+0

Увы, действительно. Я думаю, что это нужно. – GManNickG

+0

«Я пытаюсь сделать это, не используя STL». Интересно, подсчет swap? Это не зависит от абстракции итератора, но - это STL. –

1

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

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

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; 
     } 
    } 
} 
+0

Это хорошо, но, похоже, это не переворачивает его. Кроме того, любые советы по возвращению указателя? – Joe

+0

@Joe: swap() справедливо: 'temp = a; a = b; b = temp; '. Возвращение указателя, скорее всего, не то, что вы хотите сделать, поскольку оно должно указывать на что-то, в данном случае скорее всего на копию массива. Это означает использование 'malloc()' и 'free()' - не такая вещь, чтобы войти в комментарий!Вы также можете просто передать 'matrix' назад, так как это' int * ', но это означает, что это одна и та же матрица, и изменения все еще отражаются в аргументе. –

Смежные вопросы