Je suis relativement expérimenté en codage Java mais je suis nouveau en C++. J'ai écrit le code C++ suivant comme solution au problème de formation USACO que j'ai reproduit à this urlhash_map plante en C++ stl
Ce code me semble bien. Cependant, il se bloque sur l'exemple de test donné. En isolant l'erreur, j'ai trouvé que si la seconde boucle for n'est pas exécutée pour la dernière itération (je veux dire dans le cas de test de l'échantillon, n = 5, donc je lance la boucle jusqu'à i = 3 au lieu de i = 4), alors il ne plante pas (et produit la sortie attendue). Peut-être que l'erreur est ailleurs, je ne peux pas le détecter.
Toutes les idées sont les bienvenues. Merci d'avance. Veuillez m'excuser pour le formatage un peu compliqué du code (ceci est mon premier article sur le forum). Les fichiers inclus sont stdlib.h, stdio.h et hash_map.h `
#include <stdlib.h>
#include <stdio.h>
#include <hash_map.h>
struct eqstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) == 0;
}
};
int main(int argc, char** argv) {
FILE *fin = fopen("gift1.in", "r");
FILE *fout = fopen("gift1.out", "w");
hash_map<const char*, int, hash<const char*>, eqstr> table;
int n;
fscanf(fin,"%d",&n);
char name[15];
char people[10][15];
for(int i = 0; i < n; i++){
fscanf(fin,"%s",name);
strcpy(people[i],name);
table[people[i]] = 0;
}//ifor
for(int i = 0; i < n; i++){
fscanf(fin,"%s",name);
int money;
fscanf(fin,"%d",&money);
int friends;
fscanf(fin,"%d",&friends);
char fname[15];
int amt = money/friends;
for(int j = 0; j < friends; j++){
fscanf(fin,"%s",fname);
table[fname] = table[fname] + amt;
}//jfor
table[name] = table[name] - friends*amt;
}//ifor
for(int i = 0; i < n; i++)
fprintf(fout,"%s %d\n",people[i],table[people[i]]);
return (EXIT_SUCCESS);
}
`
Pour référence future: Lors de la publication d'échantillons de code, vous devez les mettre en retrait de quatre espaces pour qu'il soit correctement formaté. Vous pouvez le faire en utilisant le bouton 1010 dans la barre d'outils de formatage. – sepp2k
hash_map ne fait pas partie de stl. Utilisez std :: tr1 :: unordered_set à la place ou, en cas d'indisponibilité, utilisez boost :: unordered_set. Utilisez également iostreams au lieu de scanf. Utilisez std :: string au lieu de C Strings. Il y a tellement de problèmes avec ce code pour commencer. –
std :: tr1 :: unordered_map est l'équivalent standard de hash_map, pas unordered_set –