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

Résolu/Fermé
Bob - 3 janv. 2008 à 16:38
 was82 - 10 juin 2008 à 00:24
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!
A voir également:

6 réponses

ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
3 janv. 2008 à 18:01
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
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
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
3 janv. 2008 à 22:25
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
chapeau
0
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
4 janv. 2008 à 10:13
Félicitations, bonne continuation :-)
0
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
4 janv. 2008 à 10:22
mamiemando, toujours là pour aider ! :p
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
4 janv. 2008 à 10:25
;-)
0