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

C++ Discussion :

Les types d'itérateurs


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut Les types d'itérateurs
    J'ai constaté que les classes d'itérateurs telles que random_access_iterator n'étaient apparemment pas dans le standard, même si elles sont sur le site de la STL chez SGI. Apparemment, on utilise des tag à la place. La question à 0€ est comment changer un code qui utilisait ces classes, et pourquoi ont-elles été supprimées ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    [pas une réponse, j'en sais rien]
    Que veux-tu dire par des tag ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    on utilise des random_access_iterator_tag à la place des random_access_iterator

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    J'ai toujours vu que des implémentations avec des iterator_tag. Mes propres itérateurs utilisent ces tags.
    Sans avoir cherché, j'ai jamais rien vu d'autre pour différiencier les types d'itérateurs.
    Il me semble que les tags sont dans le standard, et il me semble bien les avoir vu dans le livre de Stroustrup.

    Donc je vois pas où est ton problème.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    La documentation de la STL de SGI n'est pas la documentation de la bibliothèque standard.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par Charlemagne
    J'ai toujours vu que des implémentations avec des iterator_tag. Mes propres itérateurs utilisent ces tags.
    Sans avoir cherché, j'ai jamais rien vu d'autre pour différiencier les types d'itérateurs.
    Il me semble que les tags sont dans le standard, et il me semble bien les avoir vu dans le livre de Stroustrup.

    Donc je vois pas où est ton problème.
    En fait, j'ai du code où le gars n'utilise pas les tags, même s'il se disait un fervent adhérent au standard... Et ça cause des problème parce qu'il faut faire des macros pour contourner le pb...
    Et avec les tag, ça donne quoi comme type de code ? C'est pas de l'héritage, j'imagine, que l'on fait ?

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    A ma connaissance les tags ne servent qu'à faire des "aiguillages".
    C'est comme ça par exemple que la STL applique les algorithmes spécialisés à l'un des 5 types d'itérateur (random, unidirectionnel, bidirectionnel, input, output) comme pour l'algorithme d' "advance", en appelant des fonctions auxiliaires surchargées.

    Quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class inIt, class Dist,class ItType> void aux_advance(InIt &it, Dist n, ItType             ) {...}
    template<class inIt, class Dist             > void aux_advance(InIt &it, Dist n, random_iterator_tag) {...}
     
    template<class InIt, class Dist> void advance(InIt &it, Dist n)
    {
      aux_advance(it,n,typepename iterator_traits<InIt>::iterator_category());
    }

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Bin, si....

    Extrait du standard (la dernière ligne de l'exemple est la plus importante) :

    Citation Envoyé par Le standard 24.3.3
    It is often desirable for a template function to find out what is the most specific category of its iterator argument, so that the function can select the most efficient algorithm at compile time. To facilitate this, the library introduces category tag classes which are used as compile time tags for algorithm selection. They are: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag and random_access_iterator_tag. For every iterator of type Iterator, iterator_traits<Iterator>::iterator_category must be defined to be
    the most specific category tag that describes the iterator’s behavior.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace std {
    struct input_iterator_tag {};
    struct output_iterator_tag {};
    struct forward_iterator_tag: public input_iterator_tag {};
    struct bidirectional_iterator_tag: public forward_iterator_tag {};
    struct random_access_iterator_tag: public bidirectional_iterator_tag {};
    }
    2 [Example: For a programdefined iterator BinaryTreeIterator, it could be included into the bidirectional iterator category by specializing the iterator_traits template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<class T> struct iterator_traits<BinaryTreeIterator<T> > {
    typedef ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    typedef bidirectional_iterator_tag iterator_category;
    };
    Typically, however, it would be easier to derive BinaryTreeIterator<T> from
    iterator<bidirectional_iterator_tag,T,ptrdiff_t,T*,T&>. —end example]
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Typically, however, it would be easier to derive BinaryTreeIterator<T> from iterator<bidirectional_iterator_tag,T,ptrdiff_t,T*,T&>
    Sauf que, contre toute attente, les types issus d'un template ne sont pas dérivés. Enfin d'après le standard que GCC suit malheureusement aveuglément et à la lettre. Nombreux sont les compilos qui n'en tiennnent pas compte. C'est l'un des plus grand grief que j'ai contre le standard C++. J'ai jamais su la raison.

    En toute rigueur il faut écrire qqch du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template<class T>
    class BinaryTreeIterator<T> : public iterator<bidirectional_iterator_tag,T,ptrdiff_t,T*,T&>
    {
      typedef iterator<bidirectional_iterator_tag,T,ptrdiff_t,T*,T&> base;
     
      typedef typename base::ptrdiff_t difference_type;
      typedef typename base::value_type value_type;
      typedef typename base::pointer pointer;
      typedef typename base::reference reference;
      typedef typename base::iterator_category iterator_category;
    ...
    };

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    OK, merci pour ces infos, je vais tenter d'utiliser ça... Pas gagné

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Je me suis replongé dans ce code, et en fait, c'est assez facile à corrigé, donc merci pour l'aide que vous m'avez apporté !

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

Discussions similaires

  1. Maxvalue pour les types de var
    Par VincenzoR dans le forum Oracle
    Réponses: 2
    Dernier message: 23/11/2005, 09h58
  2. les types des champs
    Par zidenne dans le forum Access
    Réponses: 3
    Dernier message: 18/11/2005, 12h27
  3. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  4. Comparer les types de variable
    Par onipif dans le forum ASP
    Réponses: 11
    Dernier message: 27/05/2004, 18h07
  5. fopen -> différences entres les types d'ouvertur
    Par Patrick PETIT dans le forum C
    Réponses: 10
    Dernier message: 01/06/2003, 18h19

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