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 :

Template et Conteneurs


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut Template et Conteneurs
    Bonjours je cherche a faire une fonction toute bête qui prend en paramètre en référence un conteneur et affiche l'ensemble de ses éléments. Ou si un paramètre entier a été donner après afficher les N premiers éléments.
    Débutant avec les templates j'ai fait quelques exemples basiques mais la je ne vois pas comment je dois faire ...
    Jusqu'ici j'ai fait cela (en utilisant .begin et .end qui sont commun aux trois que je veux utiliser deque list et vector)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Template <typename T>
    T affiche_serie(T[])
    {
    T::iterator it;
    for (it=T.begin();it !=T.end();it++)
       {
       std::cout << "-"<<*it;
       }
    }
    Alors je me doute bien que ca ne peut pas marcher en l'etat. surtout la 2eme ligne mais le problème est que je ne vois pas comment faire autrement. Et tout les tutoriaux que j'ai vu sur les templates n'abordait jamais le sujet des conteneurs.

    D'avance merci !

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Et bien c'est assez simple :

    1) Écrit d'abord une fonction affichant un std::vector<int>
    2) Rajoute template <typename Container> au sommet de la fonction.
    3) Remplace dans la fonction std::vector<int > par Container

    En gros tu fais le boulot inverse du compilateur qui lorsqu'il voit un appel de fonction template comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T>
    void foo(T t)
    {
       std::cout << t[0];
    }
     
    int main()
    {
       std::vector<int> v;
       foo(v);
    }
    va en fait générer une fonction classique comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void foo_vector_int(std::vector<int> t)
    {
       std::cout << t[0];
    }
     
    int main()
    {
       std::vector<int> v;
       foo_vector_int(v);
    }
    Et si tu appelles aussi foo() avec une std::ist et un std::deque, alors le compilateur génèrera trois fonctions, une pour chaque type, en remplaçant T par std::vector, std::list, std::deque etc.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut
    Ok ...
    Petit soucis la list n'accepte pas d'accesseurs [] mais sauf boulette de ma part ne peux être parcourue que a l'aide d'un iterateur comme on le vois ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename T>
    Void affiche_conteneur(const T &t)
    {
    T::iterator it;
    std::cout << "Ce vecteur d'une taille de : " << t.size()<<" il contient :"<<std::endl;
    for (it=t.begin(); it!=t.end(); ++it) 
          {
          std::cout << "-"<<*it;
          }
    std::cout << "-"<<std::endl;
    }
    Mais le probleme c'est que visiblement ma ligne
    n'est pas du tout appreciée par le compilo qui me dit :
    erreur : expected ; before "it"

    Donc j'avoue que je ne comprend pas trop il doit y avoir un truc spécifique pour creer un iterateur templater mais la je seche ...

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Cherche dans la FAQ "typename"
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Oupps, oui désolé, il y a en effet une petite subtilité lorsque l'on veut utiliser un type dit "dépendant" comme T::iterator. Il faut rajouter le mot clé typename devant pour indiquer au compilateur que l'expression T::iterator est bien un type.

    Voir par exemple la FAQ.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Et au passage, t étant const, il faut utiliser un const_iterator pas un iterator.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Par défaut
    Ah merci gl et arazar ! Voila comme ca c'est mieux !
    Hopla la solution a mon problème est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    template <typename T>
    void affiche_conteneur (const T &t,int max)
    {
    int cpt=0;
    typename T::const_iterator it;
    it=t.begin();
    string temp;
    std::cout << "Ce vecteur a une taille de :"<<t.size()<<" sont contenu arrive :"<<std::endl;
    for (;it!=t.end() && cpt<max;++it)
    	{
    	cpt++;
    	std::cout << "-"<< *it;
    	}
    std::cout <<"-"<<std::endl;
    }

    Merci beaucoup ! Bon j'ai encore un peu de mal avec les templates et les iterateurs mais déjà ca marche et c'est beaucoup. Je vais passer un peu de temps a relire les liens que vous m'avez filez ! Merci !

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

Discussions similaires

  1. Utilisation d’un conteneur générique comme type template
    Par white_tentacle dans le forum Langage
    Réponses: 5
    Dernier message: 16/04/2014, 20h22
  2. Classe template et conteneur
    Par Antonin08 dans le forum Langage
    Réponses: 11
    Dernier message: 30/09/2011, 13h23
  3. iterateur d'un conteneur template dans une classe template
    Par coyotte507 dans le forum Langage
    Réponses: 2
    Dernier message: 03/07/2009, 13h08
  4. Template / Conteneur / Objets Polymorphiques
    Par Haknaton dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2008, 08h42
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31

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