Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2691 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  utilisation des maps

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

utilisation des maps

n°1771089
mathematic​a
Posté le 08-08-2008 à 11:30:44  profilanswer
 

Bonjour,
 
Je souhaiterais utiliser des maps dans mon programme.
 
Jusque là ... je ne connaissais pas trop leur utilité et leur mode de fonctionnement.
 
je souhaiterais stocker dans ma map un élément (private) de ma classe MaClasse récupéré à partir d'un fichier de donné...
 
il existe plusieurs éléments dans mon fichier de ce type.
 
Je souhaiterais pouvoir les insérer tous dans ma map de telle sorte qu'il n y ai pas de dédoublement ....
 
ce pendant ... je ne vois pas du ts comment ça fonctionne les maps
 
Voila ce que je propose :
 
[cpp]
 
#include<map>
 
map<string, MaClasse> ma_Map;
 
ma_Map[k] = " " ; // je l'initilaise a vide au début car je souhaiterais rechercher par la suite dans ma boucle des éléments
 
 
// je commence par parcourir ma map, s'il trouve l'éléments en question il passe a la prochaine ligne dans mon fichier sinon il récupère l'éléments en question et il me le rajoute dans la map
 
for (it = ma_map.begin(); it!ma_map.end(); it++)
{
  if (ma_map[it] != l'élément en quetsion)
{ ma_map[it] = l'élément;
passer a la ligne suivante ;
}
 
else
{passer a la ligne suivante}
 
}
 
est ce que l'écriture ets correcte ??? dans le cas contraire pouvez vous m'éxpliquer svp ou se trouvent mes betises... je vous remercie.

mood
Publicité
Posté le 08-08-2008 à 11:30:44  profilanswer
 

n°1771115
Joel F
Real men use unique_ptr
Posté le 08-08-2008 à 11:54:30  profilanswer
 

y a find pour ça ... plus d'infos :
 
http://www.sgi.com/tech/stl/Map.html

n°1771120
mathematic​a
Posté le 08-08-2008 à 12:02:11  profilanswer
 

oui ... merci pour le lien  
 
voila le code que j'avais déjà écrit avec la fonction find ()
 

Code :
  1. for(map<string, maclasse*>::iterator it = map_map.begin(); it!= map_map.end(); it++)
  2.   {
  3.    if (!map_map.find(élément
  4.    { ListeP.push_back(new maclasse(élément
  5.    }
  6.   }


 
et voici l'erreur que j'ai :
 
 
error C2451: expression conditionnelle de type 'std::_Tree<_Traits>::iterator' non conforme
        with
        [
            _Traits=std::_Tmap_traits<std::string,maclasse *,std::less<std::string>,std::allocator<std::pair<const std::string,maclasse *>>,false>
        ]
 
 
 
 :pt1cable:  :pt1cable:

n°1771121
Joel F
Real men use unique_ptr
Posté le 08-08-2008 à 12:03:47  profilanswer
 

les ) manquantes c'est peut etre ca le probleme ....
et ton code veut rien dire ...


Message édité par Joel F le 08-08-2008 à 12:04:23
n°1771134
mathematic​a
Posté le 08-08-2008 à 12:14:57  profilanswer
 

c gentil ;)))) non c pas un npb de parenthèse
 
ben en fait je vous ai donén que ce qu'il y a ds la boucle for :
 
en gros je souhaite ajouter un élément qui est dans private de ma classe et qui est lu a partir d'unfichier ...
 
pour la récupération : ya pas de pb, je le récupère et je le stocke dans une string ....ts ca est dans une boucle while (non fin de fichier)
 
ce que je veux faire, c voir a chaque fois que je parcours mon fichier et que je répère mon éléments si il existe dans la map , si oui je ne fais rien je passe a la ligne suivante, sinon je le stocke dans ma liste pour l'afficher ensuite de tte sorte est ce qu'il ny ai pas de double ... c plus clair ????

n°1771135
Joel F
Real men use unique_ptr
Posté le 08-08-2008 à 12:15:36  profilanswer
 

lis la doc de map s'il te plait et revient après :o

n°1771139
mathematic​a
Posté le 08-08-2008 à 12:18:11  profilanswer
 

t gentil toi ....
 
ben je l'ai lu ... sinon j'aurais pas trouver tte seule tte ces fonctions ... mais je ne sais pas trop les utiliser ....
 
si y a un pb ... dites moi au moins ou est le pb ... je veux dire c un forum non ... on envoie pas les gens balader comme ça !

n°1771144
Joel F
Real men use unique_ptr
Posté le 08-08-2008 à 12:28:06  profilanswer
 

tu aurait lu jusqu'au bout tu aurais vu que :

 

"operator[] returns a reference to the object that is associated with a particular key. If the map does not already contain such an object, operator[] inserts the default object data_type()"

 

donc en gros tu find, tu check et tu [] c'ets tout


Message édité par Joel F le 08-08-2008 à 12:31:27
n°1771145
mathematic​a
Posté le 08-08-2008 à 12:34:35  profilanswer
 

c bien gentil encore une fois ... je sais lire mais je e comprends pas ts, je né jamais fait de l'orienté objet dans ma vie ... alors je ne comprends pas forcément ts ce qu'on dit dans la donc (et surtout qd c en anglais!!!)
 
je ne maitrise pas bien , si vous pouvez juste m'éxpliquer ce que c qu'une référence ... d'ahabitude je réussi a meiux comprendre lorsque j'ai sous les yeux des exemples concrets ... Merci!

n°1771196
Un Program​meur
Posté le 08-08-2008 à 14:00:09  profilanswer
 

Mathematica, si tu veux programmer en C++, il faut en apprendre les bases; tu as l'air d'en manquer au point que je doute que poser des questions dans un forum soit le meilleur moyen de te faire progresser; il faut quelque chose de plus structure.
 
Les maps sont faites pour retrouver efficacement la cle, ici tu as l'air de vouloir rechercher en fonction des donnees.

mood
Publicité
Posté le 08-08-2008 à 14:00:09  profilanswer
 

n°1771392
mathematic​a
Posté le 08-08-2008 à 21:57:05  profilanswer
 

Oui on pourrais considérer la clé comme étant les données .....
 
 
JE SUIS D4ACCORD AVEC TOUS,,, je ne connais pas les bases en c++ ... c juste que je dois rendre un travail pour mon école a la rentrée ....... et le programme n'est pas encore fini car ya des choses a faire et je n'ai pas le temps de ts voir en c++ :((((((((

n°1771510
bjone
Insert booze to continue
Posté le 09-08-2008 à 14:52:23  profilanswer
 

typedef map<...> machins_type;
 
machins_type::iterator iter = machins.find( macle );
 
if( iter == machins.end() )
{  
   // pas trouvé  
}
else
{
   // trouvé
}

n°1771593
Taz
bisounours-codeur
Posté le 09-08-2008 à 19:47:27  profilanswer
 

C'est vrai qu'une API avec laquelle on pourrait tester la validité d'un iterator juste avec un operator unspec-bool-type () const ça aurait été chouette.
 
Où juste un iterator it; if (m.find(k, it)) { /* it valide */ }
 
mais bon, c'est fait c'est fait.

n°1771662
Un Program​meur
Posté le 10-08-2008 à 13:17:30  profilanswer
 

Taz a écrit :

C'est vrai qu'une API avec laquelle on pourrait tester la validité d'un iterator juste avec un operator unspec-bool-type () const ça aurait été chouette.


 
On est là dans un modèle d'itérateurs qui est fondamentalement différent de celui de la SL (et plus
proche de celui du bouquin du GoF).  Les itérateurs de la SL sont une abstraction des pointeurs
avec arithmétique sur les pointeurs, et le pointeur retourné par find ressemble plus au pointeur
après le dernier élément d'un tableau qu'au pointeur nul.

n°1771697
Joel F
Real men use unique_ptr
Posté le 10-08-2008 à 15:49:55  profilanswer
 

Il y a eu pas mal de jus sur ces histoires d'itérateurs, d'allocateurs et etc.. dans les discussions du 0X avec , notamment, une belle notion de versionning de classe. Mais je sais pas si ça a abouti ou pas :/

n°1771700
Taz
bisounours-codeur
Posté le 10-08-2008 à 16:04:02  profilanswer
 

Un Programmeur a écrit :


 
On est là dans un modèle d'itérateurs qui est fondamentalement différent de celui de la SL (et plus
proche de celui du bouquin du GoF).  Les itérateurs de la SL sont une abstraction des pointeurs
avec arithmétique sur les pointeurs, et le pointeur retourné par find ressemble plus au pointeur
après le dernier élément d'un tableau qu'au pointeur nul.


faut vraiment que je me montre plus moi.

n°1771816
Malkav
Posté le 11-08-2008 à 10:24:01  profilanswer
 

aie aie aie
çà c'est juste horrible et çà ne veux pas dire grand chose

Code :
  1. for (it = ma_map.begin(); it!ma_map.end(); it++)
  2. {
  3.   if (ma_map[it] != l'élément en quetsion)
  4. { ma_map[it] = l'élément;
  5. passer a la ligne suivante ;
  6. }
  7. else
  8. {passer a la ligne suivante}
  9. }


 
ensuite une map çà permet de faire correspondre des couples d'éléments <clé,valeur>, il faut voir çà comme un dictionnaire, classé par clé 'croissante', toi si je comprend vaguement ce que tu essayes de faire tu veux simplement faire une liste des éléments trouvés dans ton fichier, sans doublons.
 
Déjà donne nous une idée du nombre d'éléments qui sont susceptibles d'y trouver (10, 100,  1000, 1 million ?), puisque pour un petit nombre d'élément ou un grand nombre on va préférer des implémentations différentes.
 
std::map et son copain std::set sont des conteneurs ordonnant les éléments par ordre croissant, çà permet de faire des recherches plus rapides lorsqu'il y a des milliers d'éléments, sinon une bête liste peut faire le travail aussi bien  
 
std::set c'est donc un peu la même utilité que les maps (recherche plus rapide si bcp d'éléments) mais avec une seule valeur, on ne stocke que <valeur> et pas <clé,valeur> comme la map.
 
pour se donner une idée simple :
set :  utile si valeur de type assez simple (un entier, une chaîne...)
map : utile si valeur complexe (une grosse classe par exemple) mais pourvue d'un identifiant unique permettant de les cataloguer (genre numéro de publication pour un bouquin, numéro sécu pour une personne etc...)
 
quelques autres remarques :
 

Code :
  1. std::map<string, MaClasse> ma_map;
  2. ma_Map[k] = " " ; // je l'initilaise a vide au début car je souhaiterais rechercher par la suite dans ma boucle des éléments


-> que vient foutre ici ce 'k' ??  
->a priori on dirait que tu veux mettre une chaîne vide à un endroit, k on ne sait même pas quel type c'est (entier, iterateur, string ?), ni même ce que contient 'MaClasse', cette ligne est juste si et seulement si :
k est une string
MaClasse à un constructeur par défaut sans paramètres
MaClasse à un opérateur d'égalité avec une chaîne de caractères
 
....et en plus çà ne sert à priori à rien du tout.
 
si je comprend ce que tu veux faire je ferais plutôt çà comme çà :

Code :
  1. std::map<string, MaClasse> ma_map;
  2. // boucle de lecture dans le fichier
  3. while ( blablabla)
  4. {
  5.     // lecture de l'élément (type string) depuis le fichier
  6.     string element;
  7.     // on recherche dans la map si l'element existe déjà ou non
  8.    if ( ma_map.find(element) == ma_map.end())
  9.    {
  10.       // element pas trouve, on insère une nouvelle valeur
  11.      ma_map.insert( make_pair(element, MaClasse(element)) );
  12.    }
  13. }


 
 
PS : partir là dessus sans connaître les bases de la Programmation Orientée Objet çà me paraît suicidaire...


Message édité par Malkav le 11-08-2008 à 10:25:50
n°1771828
Malkav
Posté le 11-08-2008 à 10:32:30  profilanswer
 

un lien qui peut peut être t'éclairer un peu, en français :
http://cpp.developpez.com/faq/cpp/?page=STL

n°1772059
mathematic​a
Posté le 11-08-2008 à 16:54:55  profilanswer
 

merci bcp ...aprés m'être pas mal documenté sur les maps .... c efefctivement ce que j'ai fait ce matin ... ey ca a fonctionné ... j'ai aussé rajouté un break pour forcer justement a aller vers la prochaine ligne dans le cas ou l'éléments n'existe pas ... en effet, ce que j'avais écris au début de n'était pas du ts bon et ca ne voulais rien dire :)))
 
merci .... je suis assez fier de moi ... et je te remercie d'avoir répondu.

n°1772130
Joel F
Real men use unique_ptr
Posté le 11-08-2008 à 18:22:40  profilanswer
 

break c'est moche, un bon vieux while ca m'a l'air mieux quand meme

n°1772482
mathematic​a
Posté le 12-08-2008 à 14:21:09  profilanswer
 

ben en fait ça ne marche pas ... ça beug même  c pour ca que j'ai préféré garder ma boucle for et mettre un break .... peut etre que j'utilise mal ma boucle ... ce qui est sûr c qu'avec break ça me donne les résultats que je souhaitais avvoir

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  utilisation des maps

 

Sujets relatifs
Probleme d'utilisation d'un objet timeVilles sue Google maps
[JS] utilisation de la librairies highlightfade de jquery[Résolu][XSLT] Utilisation de la librairie redirect
[RESOLU] Utilisation de la fonction WSAAddressToString()Utilisation dll .net dans une application C++ Visual Studio 6
Problème d'utilisation du plugin de VLC pour firefoxProblème d'utilisation des Threads avec lib javacomm
[résolu]Classes pour faciliter l'utilisation de sockets C, en C++Utilisation du onChange sur une page php
Plus de sujets relatifs à : utilisation des maps


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR