C++: Comment faire un simple dictionnaire?
Je suis en train de réaliser un dictionnaire avec 2 caractères, mots, mais pas autant de succès
Voici mon code:
#include <cstdlib>
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[]){
map<char*,int> m;
//input 5 two-lengthed words
for (int i=0;i<5;i++){
char s[3];
cin>>s;
s[2] = '#include <cstdlib>
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[]){
map<char*,int> m;
//input 5 two-lengthed words
for (int i=0;i<5;i++){
char s[3];
cin>>s;
s[2] = '\0';
m[s]=1; //add a key
}
//checking if a word exists.
cout<<"Word you want to check whether it exists:"<<endl;
char chck[3];
cin>>chck;
chck[2]='\0';
//I heard this is how you check whether a key exists:
bool exists = m.find(chck)==m.end();
cout<<((exists)?"Yes!":"No.")<<endl;
system("pause"); //Yea, system, I know.
return 0;
}
';
m[s]=1; //add a key
}
//checking if a word exists.
cout<<"Word you want to check whether it exists:"<<endl;
char chck[3];
cin>>chck;
chck[2]='#include <cstdlib>
#include <iostream>
#include <map>
using namespace std;
int main(int argc, char *argv[]){
map<char*,int> m;
//input 5 two-lengthed words
for (int i=0;i<5;i++){
char s[3];
cin>>s;
s[2] = '\0';
m[s]=1; //add a key
}
//checking if a word exists.
cout<<"Word you want to check whether it exists:"<<endl;
char chck[3];
cin>>chck;
chck[2]='\0';
//I heard this is how you check whether a key exists:
bool exists = m.find(chck)==m.end();
cout<<((exists)?"Yes!":"No.")<<endl;
system("pause"); //Yea, system, I know.
return 0;
}
';
//I heard this is how you check whether a key exists:
bool exists = m.find(chck)==m.end();
cout<<((exists)?"Yes!":"No.")<<endl;
system("pause"); //Yea, system, I know.
return 0;
}
Chaque fois que je saisir les mots, et puis quand je veux vérifier si un mot est dans le dictionnaire, j'ai toujours imprimé "Non".?
Je viens de Java j'ai donc pris l'habitude de références, pas de pointeurs, c'est là que je me suis probablement mal. Je veux apprendre à bien utiliser les cartes alors pouvez-vous s'il vous plaît ce que je suis censé faire ici?
Grâce
Il y a des références dans
Le problème, c'est tout comme vous avez pensé - pointeurs vs références. Votre carte est de stocker des pointeurs de caractères comme la clé, et depuis ils sont tous les deux sur la pile, ils n'allez plus jamais être les mêmes. Pouvez-vous utiliser des chaînes à la place de char*?
Pour ce que ça vaut, Java variables (pour les types de référence) sont BEAUCOUP plus comme C++ les pointeurs que comme C++ références.
C++
et vous pouvez presque toujours utiliser à la place des points (je dis presque très légèrement). Au lieu d'utiliser *
pour désigner pointeur, regardez &
pour les références.Le problème, c'est tout comme vous avez pensé - pointeurs vs références. Votre carte est de stocker des pointeurs de caractères comme la clé, et depuis ils sont tous les deux sur la pile, ils n'allez plus jamais être les mêmes. Pouvez-vous utiliser des chaînes à la place de char*?
Pour ce que ça vaut, Java variables (pour les types de référence) sont BEAUCOUP plus comme C++ les pointeurs que comme C++ références.
OriginalL'auteur SmRndGuy | 2013-03-01
Vous devez vous connecter pour publier un commentaire.
Oui, mais la condition est true si l'élément ne pas existent. Vous devriez appeler votre vaviable
notExists
:Maintenant, si tout ce que vous voulez faire est de vérifier si une œuvre existe, vous pouvez utiliser un
std::set<std::string>
. Si vous souhaitez que le mot clef pour quelque chose d'autre, alors vous avez besoinstd::map<std::string, SomeThingElse>
.Oublier ceux
char*
. Utilisationstd::string
s.bool exists = m.find(chck)!=m.end();
Hmm, oui, vous avez raison. mais alors encore je suis "Oui!" au lieu de deux, lorsqu'il existe ou pas.
que pourrait être une autre erreur dans votre code. Voir démo pour un exemple.
C'est parce que vous êtes toujours à l'aide de
char*
comme la clé, passtd::string
OriginalL'auteur juanchopanza
Regardons votre code un peu:
Vous avez un
std::map<char *, int>
. Ce premier "char*" est suspect comme une légende de la carte. Stocke des pointeurs que la clé n'est pas souvent ce que vous voulez vraiment faire. Mais nous avons continuer la lecture. À l'intérieur de votre boucle, vous disposez d'un local tableau s que vous remplissez. Puis vous utilisez cette variable pour l'indice sur la carte. Rappelez-vous que la clé de la carte est un char*. L'adresse de la matrice s est susceptible d'être la même à chaque itération de boucle. Comme un résultat, vous êtes probablement en mettre qu'un seul élément dans votre carte, et il ne détient la plus récente de la valeur de ce que vous mettez dans s. Mais attendez, il y a pire. Dès que votre boucle est terminée, s est hors de portée et il est maintenant un Comportement indéterminé à déréférencer le pointeur qui est actuellement stocké dans la carte (comme la clé pour le seul et unique élément de cette carte. Sortie m.taille() pour vérifier).Redéfinir votre carte à
std::map<std::string, int>
de ne pas avoir tous ces problèmes.<
et>
au lieu de > <OriginalL'auteur Andre Kostur
Chaque fois que vous "ajouter une clé" vous êtes en fait juste d'obtenir le même élément avec la même clé. La clé est l'adresse du tableau
s
, pas la valeur de la chaîne entrée.Essayez d'imprimer de la taille du conteneur et vous allez voir qu'un seul élément:
Lorsque vous mettez un
char*
dans un récipient et utilisez la comparaison par défaut de la fonction qu'ils y a qu'à comparer l'égalité quand ils sont le même pointeur, pas la même chaîne:Pour pousser de la chaîne de valeurs dans l'utilisation des conteneurs
std::string
touches, paschar*
Cela évite le problème de la comparaison de pointeurs et de la matrice de sortir de la portée laissant pendre pointeur sur la carte.
OriginalL'auteur Jonathan Wakely