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 :

Utiliser un std::set avec lambda comme attribut d'une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 28
    Points : 30
    Points
    30
    Par défaut Utiliser un std::set avec lambda comme attribut d'une classe
    Bonjour,

    Je suis en train d'écrire un petit programme qui (entre autres) utilisent deux classes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Film {
     
    private :
       int ordreSortie;
    }
     
    class Franchise {
     
    private :
       conteneur<Film*> films;
    }
    J'ai besoin d'un attribut dans Franchise pour contenir tous les Films :
    - Je veux que les Films soient ordonnées en fonction de leur attribut ordreSortie -> Donc pas de std::vector
    - Je n'ai pas besoin d'accéder aux films autrement que séquentiellement (parcourir tous les films dans l'ordre) -> Donc pas besoin de std::map
    Donc je suis parti pour utiliser un std::set

    J'aimerais ne pas surcharger l'opérateur < parce que conceptuellement, j'ai envie de les hiérarchiser d'une autre manière. C'est uniquement dans ce std::set que l'ordre de sortie sert à les classer.

    Du coup, je voulais utiliser une sorte de lambda expression comme comparateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set<Film*, [](Film* f1, Film* f2){return f1->getOrder() < f2->getOrdre();}>
    J'ai trouvé plusieurs résultats sur Internet (https://stackoverflow.com/questions/...set-comparator) du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    auto cmp = [](Film* a, Film* b) { return ... };
    std::set<int, decltype(cmp)> s(cmp);
    Le problème, c'est que je ne vois pas comment le faire marcher dans la définition de ma classe (franchise.h).

    Est ce que c'est possible ?

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 118
    Points : 32 984
    Points
    32 984
    Billets dans le blog
    4
    Par défaut
    Le comparateur doit être un foncteur ou une fonction. Si tu veux le déclarer membre. Pas une lambda.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct cmp { void operator()(const Film* a, const Film* b) { return ... }; };
    std::set<int, cmp> s;
    Mais bon, utiliser un set pour ça, je vois pas trop l'intérêt face à std::vector et std::sort.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 28
    Points : 30
    Points
    30
    Par défaut
    Ok merci pour la réponse.

    J'arrive bien à définir le std::set, mais par contre, quand j'essaie de faire un getFilms(), le type de retour n'est pas bon.

    Quand je mets set<Film*, cmp> il me dit qu'il n'y a pas de membre nommé cmp et si j'essaie set<Film*> il n'arrive pas à faire la conversion.
    Des idées ?


    J'avais mis un vector avec un sort au début mais je pensais que c'était "moins propre".
    A vrai dire, c'était ma solution de repli (ou alors une map).

    Mais dans ce cas, dans quelle situation un std::set serait-il adapté ?

    Merci

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 190
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 190
    Points : 17 146
    Points
    17 146
    Par défaut
    Un set est adapté lorsque tu veux une unicité des valeurs pour une comparaison donnée.

    Le cas d'usage typique de set, c'est quand tu veux vérifier si une valeur existe dans la liste, ou filtrer des doublons.

    Si tu a surtout besoin du parcours séquentiel, tu préfèreras en général vector, qui est plus rapide pour cette opération, avec une complexité en O(n) au lieu de O(n log n).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 28
    Points : 30
    Points
    30
    Par défaut
    Ok donc si je comprends bien :
    - Si on veut de l'unicité, on utilise un set
    - Si on veut que ça soit ordonné, on utilise un vecteur et on fait un sort

    Merci !

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

Discussions similaires

  1. Mettre une méthode comme attribut d'une classe ?
    Par droledenm dans le forum C#
    Réponses: 6
    Dernier message: 02/03/2018, 23h31
  2. Classe comme attribut d'une classe parente
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 15/12/2014, 22h41
  3. Passer un objet comme attribut d'une classe
    Par Leduc08 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/04/2011, 11h54
  4. Problème std::set avec une structure
    Par DeathMixer dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2009, 01h05
  5. find() de std::set avec fonction de comparaison
    Par Biglo dans le forum SL & STL
    Réponses: 3
    Dernier message: 13/01/2006, 08h50

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