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}}; }
3 Réponses :
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 Mais n'auriez-vous pas: std :: Array
valeurs = {{{{5, 3, 2, 16}, {9, 8, 10, 17}, {4, 7, 11, 11, 18}, {2, 5, 9, 12}, {7, 9, 4, 10}}}; code>
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 ¯\_(ã)_/¯
N'est-ce pas d'utiliser les mauvaises limites? Vous avez num_Rows code> instances de
int [num_cols] code>
Je envisagerais d'utiliser std :: copy (std :: begin (* original), std :: début (* original) + num_rows * num_cols, std :: commence (* tableau)) code> 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)) code> cependant. Si le professeur demande un
int [] [] code> ils ne voudraient probablement pas que les gens utilisent
std :: copier code>. Idéalement, utiliser C ++ STL serait la voie à suivre, oui, mais vous ne savez jamais.
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;
}
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 code> pour obtenir une vue triée i> du conteneur d'origine.
Vous créez un nouveau tableau dans
réinitialiser () code>, mais vous ne pouvez pas attribuer à des tableaux simples de toute façon. Pensez à utiliser
std :: Array code> afin que vous puissiez réaffecter
= code> it.