-1
votes

Comment réinitialiser la matrice bidimensionnelle sur son formulaire d'origine après avoir tri?

J'essaie de réinitialiser la matrice 2D à sa forme d'origine après avoir été triée avec un tri de bulles. J'ai besoin de le réinitialiser à ce que c'était avant de trier. Comment fait-on ça? Si vous avez une question à laquelle un tableau est global. C'est une tâche scolaire et c'est comme ça que notre professeur veut que nous le fassions. Voici mon programme:

void reset(){

 int array[NUM_ROWS][NUM_COLS]={{5, 3, 2, 16},
                                {9, 8, 10, 17},
                                {4, 7, 11, 18},
                                {2, 5, 9, 12},
                                {7, 9, 4, 10}};
}


4 commentaires

Cela n'est pas possible, l'ordre initial des éléments n'est préservé nulle part. Vous devrez créer une copie du tableau.


Pouvez-vous élaborer les pls? J'ai cherché Internet pour une réponse et j'ai trouvé des réponses comme "Créer une copie", mais cela n'a pas fonctionné quand j'ai essayé de le faire.


Faites une copie avant de tri. Ou, trier un nouveau conteneur de std :: référence_wrapper pour obtenir une vue triée du conteneur d'origine.


Vous créez un nouveau tableau dans réinitialiser () , mais vous ne pouvez pas attribuer à des tableaux simples de toute façon. Pensez à utiliser std :: Array afin que vous puissiez réaffecter = it.


3 Réponses :


2
votes

Votre réinitialiser code> déclare un nouveau tableau (et ne rien faire avec elle). Vous ne pouvez pas attribuer ( = code>) des tableaux de style C, vous aurez donc besoin de quelque chose qui semble différent. Si vous pouvez utiliser std :: Array code> au lieu de cela, vous pouvez attribuer dans réinitialiser code>.

const int NUM_COLS=5;
const int NUM_ROWS=4;       


1 commentaires

+1 Mais n'auriez-vous pas: std :: Array , NUM_ROWS> Valeurs ... Et puis le tableau 2D d'origine fonctionnerait? Je pense aussi que vous avez besoin d'accolades supplémentaires pour ne pas confondre le compilateur, comme: valeurs = {{{{5, 3, 2, 16}, {9, 8, 10, 17}, {4, 7, 11, 11, 18}, {2, 5, 9, 12}, {7, 9, 4, 10}}};



0
votes
void reset(){
  static int original[NUM_ROWS][NUM_COLS]={{5, 3, 2, 16},
                                {9, 8, 10, 17},
                                {4, 7, 11, 18},
                                {2, 5, 9, 12},
                                {7, 9, 4, 10}};

  for (int i = 0; i < NUM_ROWS; i++)
    memcpy(array[i], original[i], NUM_COLS * sizeof(int));
}
Not the prettiest thing, but this should work. Since that's how your professor wants you to do it, go for it ¯\_(ツ)_/¯

3 commentaires

N'est-ce pas d'utiliser les mauvaises limites? Vous avez num_Rows instances de int [num_cols]


Je envisagerais d'utiliser std :: copy (std :: begin (* original), std :: début (* original) + num_rows * num_cols, std :: commence (* tableau)) au lieu de cela boucle et memcpy


@FDAN Je ne sais pas si la matrice serait alignée correctement en mémoire, mais oui, peut-être. J'irais toujours pour memcpy (tableau, original, num_rows * num_cols * Tailleof (int)) cependant. Si le professeur demande un int [] [] ils ne voudraient probablement pas que les gens utilisent std :: copier . Idéalement, utiliser C ++ STL serait la voie à suivre, oui, mais vous ne savez jamais.



0
votes

Comme je l'ai dit dans un commentaire, le moyen le plus simple d'affecter des tableaux est de les envelopper dans une structure. Voilã, soudainement C ++ développe des capacités, il ne savait même pas qu'il avait hérité des matrices C et Copies! 1 sup> MÊME Netty, des tableaux multidimensionnels!

#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;

const int NUM_COLS=4;
const int NUM_ROWS=5;       

// Define a struct (i.e., a class with all public members)
// which has just a single member, the array. Note that this is
// only a *type* declaration, no object is created yet.
struct arrT
{
  int array [NUM_ROWS][NUM_COLS];
};

// object creation.
arrT workArr;

void reset()
{
  // The initialization value is hidden inside the function.
  // static variables are initialized only once, for constant 
  // data at compile time.
  static const arrT oriArr 
  {
    { {5, 3, 2, 16},
      {9, 8, 10, 17},
      {4, 7, 11, 18},
      {2, 5, 9, 12},
      {7, 9, 4, 10}
    }
  };

  workArr = oriArr; // simple default assignment of structs
}

// The parameters are redundant.
void stdSort(int /*row*/, int /*col*/)
{ 
  // Sort the 2D array as a one-dimensional sequence
  // (which the elements are in memory).
  // The algorithm expects iterators to the first and
  // one-after-the-last elements in the sequence. Pointers
  // to the elements in an array are perfectly good iterators.
  std::sort(&workArr.array[0][0], &workArr.array[NUM_ROWS-1][NUM_COLS]);
}

void displayArray()
{
  // The top-level elements of a 2D array are the rows...
  for(auto &row: workArr.array)
  {
    // ... and the elements of the rows are ints. 
    // Note how the
    // dimensions are known from the class declaration.
    for(auto &el: row)
    {
      cout << setw(4) << el;
    }
    cout << "\n";
  }
}

int main(){

  cout << "Work array before initialization:\n";
  displayArray();

  reset(); // before, the values of the global array are 0.
  cout<<"\nWork array after init:\n";
  displayArray();

  stdSort(NUM_ROWS, NUM_COLS);
  cout<<"\nWork array after std sort"<<endl;
  displayArray();

  reset();
  cout << "\nWork array after reset\n";
  displayArray();
  return 0;
}


0 commentaires