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

Langage C++ Discussion :

C++ - Problème parcours d'une map<int, pair<Point, Point>>


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut C++ - Problème parcours d'une map<int, pair<Point, Point>>
    Bonjour,

    J'avais ouvert un post qui ressemble à celui-ci dans le titre mais dans ce cas, le problème est tout autre.
    Je dispose de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<tuple<int,int,int>> test; 
    map<int, pair<MyPoint,MyPoint>> myMap; // La map que je remplie
    test = myPipingModel.getvectorIdPipePoint(); // vector de la forme vector<tuple<idPipe, idPoint1, idPoint2>>
    Le construction de MyPoint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyPoint::MyPoint(int id, double x, double y, double z) : idPoint(id), coordX(x), coordY(y), coordZ(z)
    {
    }
    Je rempli ma map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int p=0;
    for (auto t = test.begin(); t != test.end(); ++t) // TODO : Problème de taille ici (changer j en 2*j)
    {
    	myMap[get<0>(*t)] = make_pair(MyPoint(get<1>(*t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)), MyPoint(get<2>(*t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1)));
    	p++;
    }
    Pour le remplissage ci-dessus, je procède de la manière suivante :
    - la clé c'est idPipe que je récupère dans test. Pour remplir la paire, je dispose de trois vectors (pour X, Y et Z) avec les coordonnées. Donc pour le premier passage de boucle, je prend la position 0 de chaque vector et ainsi de suite pour le 2ème pipe et 3ème pipe.

    J'affiche ensuite le contenu de ma map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (auto p1 = myMap.begin(); p1 != myMap.end(); ++p1 )
    {
    	cout << "pipe " << p1->first << endl;
    	cout << "IdPoint 1 : " << (p1->second).first.getIdPoint() << " - x : " << (p1->second).first.getCoordX() << " - y : " << (p1->second).first.getCoordY() << " - z : " << (p1->second).first.getCoordZ() << endl;
    	cout << "IdPoint 2 : " << (p1->second).second.getIdPoint() << " - x : " << (p1->second).second.getCoordX() << " - y : " << (p1->second).second.getCoordY() << " - z : " << (p1->second).second.getCoordZ() << endl;
                 cout << endl;
    	getchar();
    }
    Et là....il se passe quelque chose de très étrange : j'obtiens bien les bons pipe : 1, 2, 3, ... mais pour les affichage des coordonées, cela m'affiche les x, y et z du milieu de mes vectors.
    Par exemple, j'ai les coordonées suivantes dans mes vectors de coordonées :
    Pour X : 1 2 3 5 6
    Pour Y : 5 2 3 6 9
    Pour Z : 5 8 9 6 3

    et bien cela va m'afficher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipe 1  idPoint 1 : 1 - x : 3 - y : 3 - z : 9
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pipe 1  idPoint 1 : 1 - x : 1 - y : 5 - z : 5
    Ca me prend à partir de la position au milieu de mes vectors ! C'est un vrai mystère...
    Si vous avez une solution à ce problème

    Merci d'avance pour vos réponses

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    je te propose quelques améliorations pratiques:

    écrire une fonction (libre) d'affichage d'un point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::ostream& operator<<(std::ostream& os, MyPoint const& p) {
        return os <<"IdPoint :" << p.getIdPoint() << " - x : " << p.getCoordX() << " - y : " << p.getCoordY() << " - z : " << p.getCoordZ() ;
    }
    et utiliser la range for loop dans ton code d'affichage deviendra:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (auto const& entry: myMap) {
    	cout << "pipe " << entry.first << endl;
    	cout << "point 1 : " << (entry.second).first << "\npoint 2 : " << (entry.second).second << '\n'<<endl;
    	getchar();
    }
    cela posé, tu as probablement déjà ta réponse, sous forme d'un commentaire marqué TODO.
    Il y a deux solutions envisageables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int p=0;
    for (auto const& tuple : test) {
    	myMap[get<0>(t)] = make_pair(
    		MyPoint(get<1>(t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    		MyPoint(get<2>(t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    	);
    	p+=2;
    }
    et, en évitant une création de temporaire inutile (dans map::operator[]):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int p=0;
    for (auto tuple : test) {
        myMap.emplace(
    		make_pair(
    			get<0>(t),
    			make_pair(
    				MyPoint(get<1>(t), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    				MyPoint(get<2>(t), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    			)
    		)
    	);
    	p+=2;
    }

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Je te remercie pour ta réponse rapide et efficace !
    J'utilise Visual C++, je ne peux donc pas utiliser auto de cette manière dans mon code. J'ai deja été confronté à ce problème. J'ai pu modifier le remplissage en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int p=0;
    for (auto tuple = test.begin(); tuple != test.end(); ++tuple) 
    {
    	myMap.emplace(
    		make_pair(
    			get<0>(*tuple),
    			make_pair(
    				MyPoint(get<1>(*tuple), myPipingModel.getX(p), myPipingModel.getY(p), myPipingModel.getZ(p)),
    				MyPoint(get<2>(*tuple), myPipingModel.getX(p+1), myPipingModel.getY(p+1), myPipingModel.getZ(p+1))
    			)
    		)
    	);
    	p+=2;
    }
    Ca me parait correct (dis-moi sinon)

    Mais pour l'affichage, je ne sais pas comment modifier la boucle FOR, j'ai essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (auto const& entry = myMap.begin(); entry != myMap.end(); ++entry) 
    {
    	cout << "pipe " << entry.first << endl;
    	cout << "point 1 : " << (entry.second).first << "\npoint 2 : " << (entry.second).second << '\n'<<endl;
    	getchar();
    }
    Mais j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2678: '++' binaire*: aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const std::_Tree_iterator<_Mytree>' (ou il n'existe pas de conversion acceptable)
    Je ne sais pas comment modifier !

    Merci d'avance pour ta réponse

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    Je précise, j'utilise Visual C++ 2010 !

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 41
    Par défaut
    J'ai trouvé !!
    Pour l'affichage j'ai tout simplement mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (auto entry = myMap.begin(); entry != myMap.end(); ++entry) 
    {
    	cout << "pipe " << entry->first << endl;
    	cout << "IdPoint 1 : " << (entry->second).first.getIdPoint() << " - x : " << (entry->second).first.getCoordX() << " - y : " << (entry->second).first.getCoordY() << " - z : " << (entry->second).first.getCoordZ() << endl;
    	cout << "IdPoint 2 : " << (entry->second).second.getIdPoint() << " - x : " << (entry->second).second.getCoordX() << " - y : " << (entry->second).second.getCoordY() << " - z : " << (entry->second).second.getCoordZ() << endl;
     
    	getchar();
    }
    Merci beaucoup pour ton aide
    Je ne regrète vraiment pas de m'être inscrit sur ce forum !

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pour information, les .begin() et .end() de map/vector/set... retourne des itérateurs, qu'il faut manipuler comme des pointeurs pour accéder à la valeur.
    Un itérateur est une classe (contenant un pointeur ou un index) et définissant deux opérations:
    • avancer (operator++())
    • comparaison (operator!=())
    • valeur courante (operator->() et operator*() )



    for (TYPE const& item : collection) permet d'accéder directement par référence constante aux éléments de la collection.
    for (Collection_type<Truc>::const_iterator it = collection.begin(); it!=collection.end(); ++it) utilise l'itérateur (constant si possible) de la collection.

    Comme c'est parfois très long à écrire, pour cause de collection template de classe template, C++11 a introduit le "auto" qui signifie littéralement:
    "Cher compilateur, puisque tu sais quel est le seul type utilisable, sers-t'en."
    ce qui autorise la notation raccourcie: for (auto it = collection.begin(); it!=collection.end(); ++it)Par contre, n'utilise auto que lorsque tu sais exactement quel type se cache derrière, et que ce sera aussi le cas du moindre lecteur.

    Comme tu l'as vu dans mes fragments de code, auto accepte certains modificateurs, tels que const et & (référence).
    D'une manière général, utilise autant que possible la référence constante quand tu manipules des classes (d'où mesauto const&)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/01/2012, 11h11
  2. [PHP 4] Problème création d'une Map pour un jeu
    Par kazylax dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2011, 13h57
  3. problème parcours d'une table sql
    Par gus8543 dans le forum SAS Base
    Réponses: 2
    Dernier message: 17/06/2008, 17h57
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39

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