[C++]surch << et map<pair<int,int>,

Résolu
Bob -  
 was82 -
Bonjour,

j'essaye de coder la surcharge de l'opérateur << adapté à l'affichage de conteneur ordonné de type : map<pair<int,int> ,double>.
Mais ça ne fonctionne pas! Je vous fais part de mon code, en espérant que vous pourrez y trouver l'erreur.

//iterateur.cpp
ostream& operator<<(ostream& out, Tableau t){
   Tableau::iterator debut=t.begin();
   Tableau::iterator fin=t.end();
   
   while(debut!=fin){
      out<<"val:"<<"(("<<(*debut).first.first<<","<<(*debut).first.second<<")"<<(*debut).second<<")"<<endl;
      debut++;
   }

   return out;
}

--------------------------------------------------------------
   //iterateur.hh
typedef map<pair<int,int> ,double> tableauAssociatif;

class Tableau : public tableauAssociatif{
private:

   tableauAssociatif tab;

public:

   double operator()(int ligne,int colonne){

      tableauAssociatif::iterator i;
      i=tab.find(make_pair<int,int>(ligne,colonne));
      if(i!=tab.end())
	 return i->second;
      return 0;
   }

   void setValeur(int i,int j, double val){
      tab.insert(make_pair(make_pair(i,j),val));
   }

   friend ostream& operator<<(ostream&, Tableau);

};


Merci d'avance pour votre aide!

6 réponses

  1. ekra Messages postés 1873 Statut Membre 342
     
    Bonjour,

    Sinon, il y a un problème : dans ton affichage tu ne regardes jamais ton attribut tableau de ta classe Tableau.
    Je ne suis pas convaincu qu'il faille faire un attribut tableau dans ta classe.
    Au lieu de faire tableau.balblablabl fais plutôt (*this).blablabla et tu n'auras pas besoin d'attribut.

    Le tableau sera l'element instancié, du style
    Tableau t;

    Pas évident le TP6 :p
    0
  2. Bob
     
    Hey! Non, pas facile le TP6!

    Je vais essayé ce que tu dis. Mais honnêtement, je vois pas en quoi, c'est un pb pour l'affichage. L'attribut tableau comme tu dis, je m'en sert dans la surcharge de l'operateur(). Pour l'affichage, les deux iterateurs debut et end devrait suffire...

    Sinon, la question 7 tu t'en sors?
    Je ne suis pas allé en cours, et je comprend rien aux iterator_traits!!
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Voici comment tu peux faire
    #include <map>
    #include <iostream>
    #include <ostream>
    
    std::ostream & operator<<(
        std::ostream & out,
        const std::map<std::pair<int,int> ,double> & x
    ){
        std::map<std::pair<int,int> ,double>::const_iterator
            xit (x.begin()),
            xend(x.end());
        for(;xit!=xend;++xit){
            const std::pair<int,int> & key = xit->first;
            const double & data = xit->second;
            out << '(' << key.first << ',' << key.second << ")\t"
                << data << std::endl;
        }
        return out;
    }
    
    int main (){
        std::pair<int,int>
            p12 = std::make_pair(1,2),
            p23 = std::make_pair(2,3),
            p13 = std::make_pair(1,3);
        std::map<std::pair<int,int> ,double> x;
        x[p12] = 5.456;
        x[p13] = 1.426;
        x[p23] = 4.759;
        std::cout << x << std::endl;
        return 0;
    }

    ce qui donne :
    (mando@aldur) (~) $ g++ -W -Wall plop.cpp
    (mando@aldur) (~) $ ./a.out
    (1,2)   5.456
    (1,3)   1.426
    (2,3)   4.759
    

    On peut même être encore plus générique :
    #include <map>
    #include <iostream>
    #include <ostream>
    
    template <typename T1,typename T2>
    std::ostream & operator<<(
        std::ostream & out,
        const std::pair<T1,T2> & x
    ){
        out << '(' << x.first << ',' << x.second << ')';
        return out;
    }
    
    template <typename T1,typename T2>
    std::ostream & operator<<(
        std::ostream & out,
        const std::map<T1,T2> & x
    ){
        typename std::map<T1,T2>::const_iterator
            xit (x.begin()),xend(x.end());
        for(;xit!=xend;++xit){
            out << xit->first << '\t' << xit->second << std::endl;
        }
        return out;
    }
    
    int main (){
        std::pair<int,int>
            p12 = std::make_pair(1,2),
            p23 = std::make_pair(2,3),
            p13 = std::make_pair(1,3);
        std::map<std::pair<int,int> ,double> x;
        x[p12] = 5.456;
        x[p13] = 1.426;
        x[p23] = 4.759;
        std::cout << x << std::endl;
        return 0;
    }

    Ainsi tu peux imbriquer des map et des paires comme tu le souhaites, il sera toujours possible de définir un opérateur <<.

    Bonne chance
    0
    1. was82
       
      chapeau
      0
  4. Bob
     
    Probleme résolu! En fait mon problème venait d'ailleurs. Comme quoi la programmation ça peut vous bouffer les neurones!

    Un grand merci pour ton aide mamiemando!
    J'ai adapté ton code au mien pour l'esayer, et en effet, ça fonctionne nickel!
    Cependant, j'ai relu le "cahier des charges", et j'étais assez loin de ce qu'il me demandait. Du coup, j'ai remodelé tout ça à ma sauce!

    Un grand merci à vous deux!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    Félicitations, bonne continuation :-)
    0
    1. ekra Messages postés 1873 Statut Membre 342
       
      mamiemando, toujours là pour aider ! :p
      0
  7. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    ;-)
    0