IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

std::map<Etat,Position> est-ce posible ?


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Par défaut std::map<Etat,Position> est-ce posible ?
    Bonjour je débute en programation C++ et je suis actuelement sur un petit programme mais je coince. J'aurai aimé savoir si il était possible de créer des map de ce genre la std::map<Etat,Position> avec Etat<std::string,std::string> et Position<int,int> ?

    Si oui merci de m'expliquer comment faire car j'ai deja tester et le compilateur me ressort Etat, Position non déclarer (ce qui est logique mais je voit pas comment faire ). J'éspère avoir été assez claire lol

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 63
    Par défaut
    tu peut declarer une map de pair
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        typedef pair<string,string> etat;
        typedef pair<int,int> position;    
        map<etat,position> p;
    ainsi tu peut ajouter des pair par simple operation d affectation
    voir fonctions membres de map

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    salut,

    la déclaration d'une std::map<cle,valeur> nécessite le type de la clé et le type de la valeur enre le < et le >...

    Tu peux donc, si cela correspond à ce que tu veux faire, utiliser std::map<int, int> voir std::map<std::string, std::string>, où le premier pourrait etre considéré comme "etat" et l'autre comme "position"...

    Une solution alternative serait de déclarer une énumération pour les états envisagé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    enum eetats
    {
        eenattente,
        ecommence,
        eencours,
        everif,
        efini,
        easupprimer,
    };
    la map deviendrait std::map<eetats,int>

    Mais, quelle que soit la solution envisagée, il faut garder en tete que tu as une contrainte d'unicité sur la clé d'une std::map que tu n'a pas sur la valeur...

    Si donc il est envisageable d'avoir, à un moment donné, deux éléments avec l'etat efini, il faudra utiliser plutot une multimap, voir, envisager d'utiliser "position" en tant que cle, si elle est consédérée comme unique
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Par défaut
    Merci a vous deux Ocean24 je vais essayer ton truc mais il mesemble que j'avait deja tester et que sa avait planter je vais retester on verra
    Sinon Koala01 ba j'ai pas trop compris tu truc mais merci d'avoir repondu

    Bon apres avoir teste la solution a ocean24 ba j'ai les erreur suivante
    1>e:\Partie.cpp(46) : error C2923: 'std::map'*: 'Etat' n'est pas un argument de type modèle valide pour le paramètre '_Kty'
    1> e:\Partie.cpp(44)*: voir la déclaration de 'Etat'
    1>e:\Partie.cpp(46) : error C2923: 'std::map'*: 'Position' n'est pas un argument de type modèle valide pour le paramètre '_Ty'
    les std::pair faut les mettre dans la fonction ou ce situe ma map ou dans la classe ? (il y a les meme erreur dans les deux cas)

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Bah, mon explication est simple, meme si elle n'est pas tres claire

    Une machine à état, c'est une valeur qui est modifiée en fonction de ce qui a été fait et/ou de la prochaine étape à effectuer...

    En cela, une énumération est idéale parce que, plutot que d'avoir une valeur 1, 2 ou 3, on peut disposer d'un terme qui explique qu'elle vaut ('EnAttente", "ACommencer", "EnCours", "DevenuInutile"... ou, si tu préferes de manière plus générique Etat1, Etat2, Etat3)

    L'avantage suplémentaire de l'énumération, c'est que, en C++, quand tu définis une énumération, tu définis également un type qui peut etre utilisé pour tout, comme si c'était un type tout ce qu'il y a de plus classique, que ce soit pour déclarer une variable, ou comme parametre fournit à un conteneur de la STL...

    D'un autre coté, il y a la "position"...

    Soit, c'est la position, dans le sens "position dans la file d'attente", et, à ce moment là, un entier ou une chaine peut suffir avec des valeurs de l'ordre de 1, 2, 3, 4... ou "premier", "deuxième", "troisième" ...

    Soit c'est une position dans le sens "coordonées", à deux ou à trois dimentions, et il faudra donc créer une structure permettant de contenir les valeurs à représenter, ou utiliser un tableau qui puisse les contenir.

    Au niveau de la std::map, c'est un conteneur "associatif" "trié"

    C'est à dire qu'il permet de créer une relation entre les valeurs représentée par deux types différents (la clé d'un coté et la valeur de l'autre), en effectuant un tri sur la clé afin de pouvoir la retrouver plus rapidement...

    La clé tout autant que la valeur doivent représenter des types connus par le compilateur, qu'il s'agisse de types "de base" (char, int, long...) ou des types "définis par l'utilisateur" (énumération, std::string, classe quelconque)

    L'astuce, pour la "cle", c'est que, en plus, il faut pouvoir mettre un test de l'ordre de cle1 < cle2 < cle3 ET que chaque clé ne peut apparaitre qu'une seule fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cle  valeur
    1    "bonjour"
    2    "au revoir"
    3    "salut"
    4    "machin"
    5    "bonjour" (de nouveau)
    représnente une std::map correcte, car aucune clé n'est identique à une autre (et ce, bien que les valeurs puissent etre identiques)

    Par contre,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cle  valeur
    1    "bonjour"
    1    "salut"
    2    "au revoir"
    3    "machin"
    n'est pas possible, du fait qu'on a deux fois la meme clé: le 1...

    Si tu veux pouvoir mettre deux fois la meme clé, il faut alors te tourner vers la std::multimap qui permet, justement, d'avoir des clé "dupliquées" (plusieurs fois la meme valeur),et qui acceptera le deuxième exemple

    Donc, pour créer ta map dont la clé est l'état et la valeur la position, il s'agit de la déclarer sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::map<type utilisé pour l'etat, type utilisé pour la position> mamap;
    //autrement dit, selon les choix qui sont fait pour l'état et la position
    std::map<int, int> ex1;
    std::map<eetat, int> ex2;//eetat étant l'énumération des états
    std::map<eetat, std::string> ex3;//position sous forme de "premier"
    std::map<int, std::string> ex4;
    std::map<int, position> ex5;//position étant le type que tu a créé pour les
                                // coordonnées
    std::map<eetat, std::position> ex6; //eetat étant l'énumération et position
                                        // le type créé pour les coorodonées
    Et, bien sur, si tu prévois que plusieurs éléments puissent etre à un meme état à un moment donné, il faudra utiliser la std::multimap, sinon, cela ne fonctionnera pas

    As tu compris mes explications
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Par défaut
    oui merci j'ai beaucoup mieux compris
    En faite ce que je veux faire c'est une bataille navale (c'est un projet pour mon école et je suis pas tres douer en prog ^^) et je veut enregistrer les coordonnée des bateaux (choisit pas le joueur les coordonnees) donc j'ai creer ma fonction PlacementBateaux et je veux donc les enregistrer dans une map du style std::multimap<Etat,Position>
    Etat correspondra <TypeBateau, Touche ou NON> donc deux string
    Position <CoordX, CoordY> donc deux int

    Mais en faite je ne suis pas sur d'avoir choisit le bon conteneur pour ce genre de truc Vous en pencez quoi ?

    ps: je vais réfléchir a ton idee sur les enumération merci

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    J'ai l'impression que tu pars sur de tres mauvaises bases...

    Car, à bien y réfléchir, l'état est "simplement" le nombre de cases qui restent au navire avant de couler, et la posiition est la coordonée sur la grille à laquelle se trouve, par exemple, la proue du navire...

    Mais il te manque, aussi, l'orientation du navire (la direction vers laquelle il faut aller pour trouver la poupe: en haut, en bas, à gauche ou à droite )

    Et, toutes ces informations font partie du navire en lui-meme, et doivent donc faire partie du "type de base" dont chaque navire est une représentation

    D'un autre coté, la "grille" sur laquelle on place les navires, qui doit etre composée d'une matrice de cases (n lignes sur m colones), dont chaque case indique si elle est
    • non testée et libre (pas de partie du navire dessus)
    • testée et libre
    • non testée et non libre (une parite d'un navire se trouve dessus)
    • testée et non libre (la partie du navire qui était dessus a été touchée)
    • non testée et contenant la "proue" du navire
    • testée et contenant la "proue" du navire (qui a été touchée )

    Restera à créer les algorithmes qui permettent de retrouver la proue du navire, et de créer une intelligence artificielle qui tente de trouver les navires
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Par défaut
    merci de ton aide je vais donc recommencer ...
    Mais donc pour faire les matrice en C++ c'est avec vector ( pas vu sa en cours ) ??? oui la je suis couler mdr

    merci encore de ton aide

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    En tant normal, je conseillerais l'utilisation d'un std::vector, mais, étant donné qu'ici, on connait parfaitement le nombre de lignes et le nombre de colones, cela ne me choquerait absolument pas de voir la grille sous la forme d'un tableau deux dimentions "à la C"...

    [EDIT]j'entend par là une grille déclarée sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    letypequivabien grille1[ligne][colone]
    letypequivabien grille2[ligne][colone]
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 73
    Par défaut
    aaa ok je vien de comprendre je pence ... en faite par exemple je fait un tableau de int que j'initialise 0 par exemple pour dire que aucun bateau ce situe sur cette case et apres je modifie le int suivant si il y a un bateau etc ... j'espère que j'ai bien compris ^^. merci de ton aide

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Salut,
    si je peux te donner un conseil, avant de chercher quel conteneur sera bon pour telle ou telle chose de ton jeux, prends un peu de temps pour réfléchir à sa conception, et essaie de le modéliser ...

    Comment représenter un bateau ?
    Comment représenter une grille de jeu ?
    Quels sont les intervenants du jeu (joueurs, arbitre) ?
    Quelles sont les relation entre eux ?

    Et au fur et à mesure les choix de "types" t'apparaitront plus clairement ...
    Là, tu risques d'en faire, et puis de les remettre en cause trop souvent.

    @+

Discussions similaires

  1. std::map tester si une clé est présente
    Par mister3957 dans le forum SL & STL
    Réponses: 2
    Dernier message: 08/04/2006, 12h31
  2. Accession aux std::map triées ?
    Par Matthieu Brucher dans le forum SL & STL
    Réponses: 5
    Dernier message: 18/11/2005, 14h44
  3. std::map<int,CStringArray> ????
    Par philippe V dans le forum MFC
    Réponses: 1
    Dernier message: 12/10/2005, 06h48
  4. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  5. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo