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

SL & STL C++ Discussion :

Customisé les algorithmes de la stl sur de nouveau tag d'iterateurs


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut Customisé les algorithmes de la stl sur de nouveau tag d'iterateurs
    Quelle est la procédure standard pour ça ? J'ai un nouvel iterator_tag foo, comment doté transform etc du comportement que je souhaite pour des itérateurs de ce type ?

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En proposant des nouvelles surcharges pour ton tag qui seront candidates au tag dispatching qu'effectuent normalement les algos standards ?
    (en assumant que tu as déjà spécialisé iterator_traits pour des nouveaux itérateurs qui ont le tag en question)

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Normallement, et si j'ai bien compris la norme, en plus d'avoir une fonction std::transform<clas In, class Out, class Fn> transform(In,In,Out,Fn), tu as aussi une fonction à spécialiser std::transform<clas In, class Out, class Fn,class InTag,class OutTag> transform(In,In,Out,Fn,InTag,OutTag).

    La première appelle la seconde, les deux derniers paramètres étant égaux à

    std::iterator_traits<In>::iterator_category()
    std::iterator_traits<Out>::iterator_category()

    (d'où la nécessite de spécialiser iterator_traits<> pour ton type itérateur).

    libstdc++ de g++4.4 implémente les iterator tags donc tu peux jeter un oeil. Le problème que je lui trouve, c'est que cette librairie rajoute un double underscore devant le nom de la fonction. Donc en gros, au lieu de spécialiser transform, tu spécialise __transform.

    Ensuite, c'est l'implémenteur qui a choisi quelle fonction pouvait être spécialisée. Pour g++4.4, j'ai mal choisi mon exemple : transform n'est pas spécialisable de cette façon. La norme ne donne pas de liste de fonction spécialisable sur cette base.

    La solution extrême, c'est donc de spécialiser directement sur le type des itérateurs (ce qui est autorisé par la norme).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Merci Emmanuel. J'en était arriver a une conclusion similaire mais je ne me sentais pas d'ouvrir std comme si de rien n'était. Merci pour la confirmation.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Merci Emmanuel. J'en était arriver a une conclusion similaire mais je ne me sentais pas d'ouvrir std comme si de rien n'était. Merci pour la confirmation.
    Le truc, c'est que comme la norme ne spécifie pas le nom de la fonction sous-jacente appelée, je ne sais pas trop comment ça va pouvoir se faire de manière correcte et portable...

    Edit: je viens de vérifier, et c'est effectivement le cas. Du coup, ça rends difficile voir impossible l'extension de la librairie standard avec un nouveau type d'itérateur. Je vais essayer de remonter ça.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    OK merci. Le top serait un std::ext::<nom de la fonction>

  7. #7
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Quelle est la procédure standard pour ça ? J'ai un nouvel iterator_tag foo, comment doté transform etc du comportement que je souhaite pour des itérateurs de ce type ?
    Surcharger pour ton tag? (ça implique d'ouvrir le namespace std mais bon...)

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

Discussions similaires

  1. aide sur les Algorithmes Génétiques
    Par amineyamane dans le forum Intelligence artificielle
    Réponses: 8
    Dernier message: 30/06/2008, 01h52
  2. Réponses: 1
    Dernier message: 29/02/2008, 17h54
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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