2009-12-01 11 views
0

J'ai créé une fonction pour retourner horizontalement un tableau 2d carré, donc la première rangée est déplacée vers la dernière, la deuxième rangée est déplacée vers la seconde depuis la dernière et ainsi de suite.C++, manipuler un tableau 2d

est la fonction ici:

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); 
} 

Je sais que cela est très inefficace, mais je suis assez nouveau pour C++. Je me demandais comment je pourrais adapter cela pour être plus efficace, peut-être en retournant un pointeur? Je me demande aussi s'il y a un moyen de le faire sans créer un tableau temporaire?

Je devrais également noter, j'essaye de faire ceci sans employer le STL.

Merci pour l'aide.

+0

Je suppose par 'size' que vous voulez dire« ROWS »ou« COLS »? – GManNickG

+0

Oui, si size = 5, alors ROWS = 5 et COLS = 5. – Joe

+0

Il semble illogique de passer les deux ROWS/COLS avec la taille. – GManNickG

Répondre

3

Vous pouvez utiliser std::swap et échanger simplement les valeurs en place:

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]); 
     } 
    } 
} 

Swap est défini dans <algorithm>. Si vous ne pouvez vraiment pas utiliser STL, swap est assez simple à mettre en œuvre:

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

Après avoir rempli la moitié de la matrice, ne répétera-t-elle pas les mêmes valeurs? – Naveen

+0

Oops, en effet. Je pense que ça devrait le faire. – GManNickG

+0

"J'essaie de le faire sans utiliser la STL" Je me demande si swap compte? Il n'est pas vraiment dépendant de l'abstraction de l'itérateur, mais est STL. –

1

Si vous pouvez utiliser une structure de données différentes pour représenter la matrice, vous pouvez obtenir un algorithme plus efficace sans utiliser STL. Par exemple, pensez à utiliser un tableau de pointeurs pour une liste de tableaux, chacun représentant une ligne de matrice. Avec cette structure de données, il vous suffit d'échanger le pointeur si le premier tableau et n'avez pas besoin de toucher des éléments dans la liste de tableau.

0

Copie des valeurs à matrice copie wont les valeurs à l'appelant de flipMatrix, puisque les tableaux avec la taille connue (ici, ROWS x COLS) sont passés par valeur:

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 } 

Ainsi combinant cela avec la réponse de GMan, étendre le swap:

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

C'est bon, mais ça ne semble pas le retourner. En outre, des conseils sur le renvoi d'un pointeur? – Joe

+0

@Joe: swap() est juste: 'temp = a; a = b; b = temp; Retourner un pointeur n'est probablement pas ce que vous voulez faire, car il doit pointer vers quelque chose, dans ce cas probablement une copie du tableau. Cela signifie utiliser 'malloc()' et 'free()' - pas le genre de chose à entrer dans un commentaire!Vous pouvez également simplement passer 'matrice' en arrière, puisque c'est un' int * ', mais cela signifie que c'est la même matrice, et les changements sont toujours reflétés dans l'argument. –