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 :

imiter une requête SQL à l'aide de la STL


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut imiter une requête SQL à l'aide de la STL
    Bonjour, est-ce qu'il possible d'imiter une requête SQL du genre SELECT FROM WHERE sur une std::map à l'aide des fonctions de la STL.

    La std::map ayant une forme à peu près comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef std::map<std::string, ObjectPtr> TBDD;
    TBDD objects;
    avec le string en tant que clé (unique), et l'ObjectPtr un shared_ptr vers un Objet initilisé dynamiquent.

    Ma question serait donc, comment effectuer une requête SQL du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key = 'abc' AND o.member = 'foo'
    sur la map en utilisant la STL pour recevoir un ObjectPtr en retour.

    Merci d'avance pour toute idée, suggestion ou piste de recherche éventuelle.

  2. #2
    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
    Si tu veux de l'SQL pourquoi n'utilises-tu pas carrément un SGBD ?

    Sinon on fait comme la clé est unique, il suffit de faire : (je pars du principe que ObjectPtr est un pointeur, chose assez étrange d'ailleurs pour une base de données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::map<std::string, ObjectPtr>::iterator it = objects.find("abc");
    if(it != objects.end() && it->second->member = "foo")
        // ton truc est trouvé

  3. #3
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Citation Envoyé par loufoque
    Si tu veux de l'SQL pourquoi n'utilises-tu pas carrément un SGBD ?
    Parce qu'un SGBD, même TinySQL, serait déjà trop pour la petite lib que je suis en train d'écrire.

    Pour les pointeurs, cela s'explique par le fait que les objets sont créés dynamiquement en parsant de l'XML (via un parseur SAX), et que la map est contenue dans un singleton.


    Merci déjà pour cette réponse. Maintenant, si quelqu'un aurait une idée comment faire un MAX() ou MIN() pour membre member de type numérique... parce que c'est là-dessus que je bloque.

    EDIT: je précise MAX() et MIN() d'SQL, pour une requête du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key == 'abc' AND MIN(o.nummember)

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu devrais jeter un oeil à miniDB, ça pourrait t'intéresser.
    http://freshmeat.net/projects/minidb/
    http://www.garret.ru/~knizhnik/ (page de l'auteur)

    J'ai découvert ça cette semaine : ce que ce gars fait a l'air énorme. Avec miniDB tu aurais notamment, si j'ai bien compris, un SGBD très facilement embarquable pour des petites applications, avec un support de SQL (limité mais largement suffisant si tu ne pousses pas trop), et ne nécessitant pas forcément un client et un serveur pour fonctionner. De plus l'interface C++ semble plutôt bien foutue.
    Et toujours si j'ai bien compris, aucune prise de tête pour l'utilisation : tu inclues les sources dans ton projet, tu compiles, ça marche.
    Encore un truc chouette : ta base de données c'est un fichier ; le jour où tu veux la bouger / copier, un clic suffit. Enorme.

    A voir donc.

  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
    oui enfin autant prendre sqlite

  6. #6
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    oui, enfin, stocker les données n'est pas le problème, elles le sont dans un fichier XML. Mon objet pointé par l'ObjectPtr contient aussi des variables créés lors de l'execution (des GLuint referencant vers des shaders, pour être exact), et ce n'est pas le type de données que je peux stocker dans une BDD (enfin, il vaut mieux pas).

    Parce que dans ce cas, j'aurais pu prendre aussi une implementation un tant soit peu complète de la DOM, et me servir de XPath, XQuery (?) ou autre (DOM) pour les accéder. Or bien conscient des ressources que ca consomme et du côté peu pratique de la chose (je veux séparer la compilation desdits shaders de leur execution), j'ai justement choisi de ne pas le faire.

    Donc, pour ce qui de mon problème, ca n'est pas possible avec la STL?

    EDIT: en analysant mon problème, j'ai remarqué que je peux me passer des pointeurs pour la partie BDD. En fait, je n'ai que 5 champs entrant en compte.
    {classe, moduleID, degree, lodHW, lodVendor}
    (les champs en italique sont clés de la base, et le champ souligné et clé unique d'une entrée. Le champ degree est la seule variable numérique, tous les autres champs sont des strings).

    Pour ainsi dire, il me semble qu'il n'y a aucun élément de la STL pouvant organiser ces données, si?
    Il me faudrait donc un SGBD, mais il m'en faudrait un qui n'existe qu'en RAM uniquement, sans éventuels fichiers, et rapide. Des idées?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne suis pas sûr de ce qu'il te faut... Peut-être boost.multi_index ?

    Ta base, elle sert à quoi au juste ?

    Il me faudrait donc un SGBD, mais il m'en faudrait un qui n'existe qu'en RAM uniquement, sans éventuels fichiers, et rapide. Des idées?
    D'après ce que j'ai compris ça vaut le coup de regarder ce que je t'ai cité dans mon dernier post. On m'en a parlé justement pour les qualités que tu cites (entre autre) ; au niveau rapidité c'était également imbattable (du fait justement de la structure simplifiée -- il y a des chiffres sur le site).

    PS : je ne suis également pas contre une petite explication de ce que tu essayes de faire avec tes shaders, ça peut être intéressant

  8. #8
    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
    Merci déjà pour cette réponse. Maintenant, si quelqu'un aurait une idée comment faire un MAX() ou MIN() pour membre member de type numérique... parce que c'est là-dessus que je bloque.

    EDIT: je précise MAX() et MIN() d'SQL, pour une requête du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM objects o WHERE key == 'abc' AND MIN(o.nummember)
    Il semblerait que tu n'aies toujours pas compris que ta clé est unique.
    Cela n'a donc pas de sens de chercher le minimum en plus de la clé....

  9. #9
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    oui, bon, l'exemple était mal choisi (ou plutôt mal écrit).
    La facon correcte serait plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT key FROM objects WHERE MIN(nummember)
    Je ne suis pas du tout contre l'emploi de boost, vu que je m'en sers ailleurs.
    Je suis d'ailleurs en train de regarder boost::multi_index et boost::property_map.

    Laurent>je posterais un lien une fois ce projet (ma thèse de mastère en informatique) terminé (ou du moins en version beta).

  10. #10
    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
    std::min_element(objects.begin(), objects.end())

    En définissant correctement operator< pour ton type (ou alors en utilisant un prédicat)

  11. #11
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    L'utilisation d'un prédicat me semble la meilleure solution, vu que cela me permet d'utiliser mes classes existantes.
    Merci grandement pour cette idée.

    Retour aux livres pour en comprendre le fonctionnement...

    EDIT:
    Les livres ne sont pas d'une trop grande aide concernant le prédicat de comparaison. Est-ce qu'il y aurait une âme charitable pour en expliquer le fonctionnement par l'exemple d'une std::map comme citée au-dessus?


    Sinon, pour ce qui était de ma question initiale, le conteneur boost::multi_index correspond assez bien à une solution. http://boost.org/libs/multi_index/doc/tutorial.html

    Du moins une solution que je garde en mémoire si le prédication ne fonctionne pas...

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tu peux effectivement définir des foncteurs pour avoir une plus grande expressivité dans tes requêtes sur des conteneurs de ls SL. Tu as des exemples dans la FAQ.

    Il y a quelques temps j'avais tombé ici une solution de ce genre. Elle est incomplète. Clairement. C'est plus une étude de faisabilité. Et plus j'y réfléchi, plus je me demande si c'est vraiment exploitable en production.
    Bref. Voilà:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    #include <vector>     // std::vector
    #include <string>     // std::string
    #include <algorithm>  // std::copy, 
    #include <functional> // std::unary_function
    #include <iterator>   // std::ostream_iterator, std::back_inserter
    #include <ostream>    // std::ostream
    #include <iostream>   // std::cout
    #include <cassert>    // assert
    #include <luc_lib/copy_if.hpp>
     
     
    /*-------------------------------[ Ligne de la base ]------------------------*/
    // Définition à la va-vite d'une ligne.
    struct line_type : public std::vector<std::string> {
        template <typename IterIn>
        line_type(IterIn first, IterIn last) 
            : std::vector<std::string>(first, last) {}
     
        friend std::ostream & operator<<(
                std::ostream & os, 
                const line_type & l) 
        {
            std::copy(l.begin(),l.end(), 
                    std::ostream_iterator<std::string>(os, " - "));
            return os;
        }
    };
     
     
    /*-------------------------------[ Clauses de recherche ]--------------------*/
    // Clause Where pour sélectionner certaines lignes seulement
    class Where : std::unary_function<std::vector<std::string>, bool>
    {
        typedef std::vector<std::string> line_type;
        typedef line_type::size_type     field_id_type;
        typedef line_type::value_type    field_type;
        field_id_type field_nb_;
        field_type    field_;
    public:
        Where(field_id_type id, const field_type & f)
            : field_nb_(id), field_(f) {}
        bool operator() (const line_type & l) const {
            return l[field_nb_] == field_;
        }
    };
     
    // Pour définir des ET-logiques entre clauses Where
    template <typename P1, typename P2>
    class PredicateAnd : std::unary_function<std::vector<std::string>, bool>
    {
        P1 p1_;
        P2 p2_;
    public:
        PredicateAnd(P1 p1, P2 p2) : p1_(p1), p2_(p2) {}
        bool operator() (const line_type & l) const {
            return p1_(l) && p2_(l);
        }
    };
     
    // Pour écrire plus simplement les fameux ET-logiques
    template <typename P1, typename P2>
    PredicateAnd<P1,P2> operator&&(P1 p1, P2 p2) {
        return PredicateAnd<P1,P2>(p1, p2);
    }
    // Faire la même chose pour les OU-logique
     
     
    /*-------------------------------[ Prédicat de comparaison ]-----------------*/
    // Prédicat pour trier des lignes suivant un champ donné
    class CmpCol { 
        unsigned int col_; 
    public: 
        CmpCol(unsigned int c) : col_(c) {} 
        bool operator()( 
            const line_type & v1, 
            const line_type & v2) const 
        { 
            assert(v1.size() >= col_); 
            assert(v2.size() >= col_); 
            return v1[col_] < v2[col_]; 
        } 
    }; 
     
     
    /*===============================[ Prog Princ ]==============================*/
    int main (int argc, char **argv)
    {
        // 0- Initialise la base initiale
        const char* lig1[] = { "Toto", "maison", "C" };
        const char* lig2[] = { "Titi", "cabane", "B" };
        const char* lig3[] = { "Tutu", "tente", "A" };
        const char* lig4[] = { "Tata", "appart", "E" };
        const char* lig5[] = { "Bobo", "maison", "D" };
        const char* lig6[] = { "Baba", "maison", "D" };
     
        typedef std::vector<line_type>   base_type;
     
        base_type basePrincipale;
        basePrincipale.push_back(line_type(lig1, lig1+3));
        basePrincipale.push_back(line_type(lig2, lig2+3));
        basePrincipale.push_back(line_type(lig3, lig3+3));
        basePrincipale.push_back(line_type(lig4, lig4+3));
        basePrincipale.push_back(line_type(lig5, lig5+3));
        basePrincipale.push_back(line_type(lig6, lig6+3));
     
        // Affiche base initiale
        std::copy(basePrincipale.begin(),basePrincipale.end(), 
                std::ostream_iterator<line_type>(std::cout, "\n"));
     
        // extrait une sous-base avec le second critère : maison
        base_type b2;
        luc_lib::copy_if(basePrincipale.begin(),basePrincipale.end(),
                std::back_inserter(b2), Where(1, "maison"));
        std::cout << "\n--------\n";
        std::copy(b2.begin(),b2.end(), 
                std::ostream_iterator<line_type>(std::cout, "\n"));
     
        // extrait une sous-base avec les derniers critères
        base_type b3;
        luc_lib::copy_if(basePrincipale.begin(),basePrincipale.end(),
                std::back_inserter(b3), Where(1, "maison") && Where(2,"D"));
        std::cout << "\n--------\n";
        std::copy(b3.begin(),b3.end(), 
                std::ostream_iterator<line_type>(std::cout, "\n"));
     
        // On trie le résultat suivant le premier champ (pas de tri pour
        // l'instant)
        std::sort(b3.begin(),b3.end(), CmpCol(0));
        std::cout << "\n--------\n";
        std::copy(b3.begin(),b3.end(), 
                std::ostream_iterator<line_type>(std::cout, "\n"));
     
        // Tri de la base initiale suivant le champ 2
        base_type & b = basePrincipale;
        std::sort(b.begin(),b.end(), CmpCol(1));
        std::cout << "\n--------\n";
        std::copy(b.begin(),b.end(), 
                std::ostream_iterator<line_type>(std::cout, "\n"));
     
        std::cout.flush();
        return 0;
    }
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    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
    Luc > Ca se rapproche quand même pas mal de requêtes, c'est sympa.
    A utiliser dans nos programmes de "loisirs", il n'y a aucun doute sur la faisabilité de la chose.
    Mais en production ... Faut voir si c'est rentable quand à la rapidité de développement et les performances d'exécution.

  14. #14
    fd
    fd est déconnecté
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Par défaut et
    Salut,

    Tous les bons bouquins déconseillent fortement de surcharger l'operator&&
    car il évalue toujours les 2 termes du &&

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par fd
    Salut,

    Tous les bons bouquins déconseillent fortement de surcharger l'operator&&
    car il évalue toujours les 2 termes du &&
    Je crois que tu as manqué quelque chose. Il s'en sert pour composer des fonctions, et la fonction composée aura bien le comportement qu'il faut.

  16. #16
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par Alp
    Luc >Mais en production ... Faut voir si c'est rentable quand à la rapidité de développement et les performances d'exécution.
    Côté perfs, je ne me fais pas trop de soucis. Une bonne partie des choses devrait s'inliner -- avec les risques sur les caches ... Après, comme pour les vraies bases, c'est à nous d'utiliser des tables d'indexage pour améliorer les recherches

    Côté production. J'en vois difficilement l'intérêt. Même pour une petite base loisir d'une centaine d'éléments, je me vois plus utiliser une base fichier qu'une base intégralement chargée en mémoire.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    Merci pour les constributions, mais une question assez précise me reste: dans le cas de ma
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<std::string, ObjectPtr>
    ,
    quelle est la facon d'écrire l'operator() du foncteur? Quelle signature lui donner, quels types? C'est là-dessus que je bloque actuellement, puisque ni un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<std::string, ObjectPtr>::iterator
    ni un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::pair<std::string, ObjectPtr>
    ne me semblent fonctionner.


    (à vrai dire, je n'ai pas encore trop d'expérence avec la STL).

    EDIT: j'ai obtenu un truc qui semble fontionner (aucune erreur de compilation + aucune erreur d'execution, pour l'instant), mais ca me deplait grandement d'avoir surchargé l'operator< pour des ObjectPtr, au point à en avoir froid dans le dos.

    Un comparateur (foncteur) me semble être la solution la plus propre en fin de compte, et la plus logique aussi.

    (Sérieux, un operator< pour des pointeurs, qui compare un membre de l'objet pointé, ca fait mal à la logique )

  18. #18
    Membre éclairé
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Par défaut
    en tant que mot de fin de ma part de ce fil, je me permet de conclure sur les éléments importants que travailler avec une std::map<> avec des prédicats m'a appris, en espérant que cela puisse être utile à quelqu'un ayant le même problème.

    Predicat de comparaison (pour min_element, max_element, min, max, ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct CompPredLesser
    {		
    	virtual bool operator()(std::map<>::value_type const& lh, std::map<>::value_type const& rh)
    	{
    		return true;
    	}
    };
    Predicat de recherche (pour find_if,...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct CondPredIf
    {
    	virtual bool operator()(std::map<>::value_type const& lh)
    	{
    		return /* votre condition, dont les paramètres autres que l'élément à tester doivent être initialisés auparavant, par exemple à travers des variables membres et un constructeur adéquat*/;
    	}
    };
    (la virtualité de l'operator() vous permet de créer une hiérarchie de prédicats ayant tous la même signature de fonction, et d'obtenir plus de flexibilité au niveau de vos recherches.)

    Merci cependant à toutes les contributions ici, qui m'ont aidé à progresser, tant au niveau de la prog de mon projet, qu'au niveau de connaissances en C++.

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

Discussions similaires

  1. aide sur une requête sql
    Par sanach dans le forum Développement
    Réponses: 9
    Dernier message: 17/10/2007, 20h42
  2. Aide pour construire une requête SQL
    Par squalito dans le forum Oracle
    Réponses: 1
    Dernier message: 09/03/2007, 15h04
  3. Aide pour construire une requête SQL
    Par squalito dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/03/2007, 14h08
  4. Besoin d'aide pour une requête SQL
    Par Borami dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 10h33
  5. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56

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