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 :

visiteur sur elements d'un container STL


Sujet :

C++

  1. #1
    Membre du Club Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Points : 52
    Points
    52
    Par défaut visiteur sur elements d'un container STL
    Bonjour à tous,

    J'ai un petit souci concernant à une fonctionnalité que je dois implémenter.
    J'ai l'idée mais je ne sais pas comment la mettre en pratique en C++.
    En fait j'ai un conteneur (mettons un conteneur de la STL) qui contient des pointeurs vers des objects d'une classe A .
    J'aimerais bien créer une methode qui permette de parcourir les elements de mon conteneur et qui prenne comme paramettre des fonctions qui puisent s'appliquer à la structure de données A.
    J'ai entendu parler de "visitors" et de "funtors" mais je ne sais pas s'ils servent à ça et je ne sais pas comment les implementer.

    Mon code doit ressembler à qqch comme ça :

    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
     
    //declaration de la classe...
    class A
    {
        A(){};
        ~A(){};
        public : 
             int _number1, number2;        
    };
     
    class Container
    {
        //blablabla...
        //Attribut qui contient pointeurs vers des objets de la classe A
        std::vector<A*> vectorA;
     
       //Methode qui parcours le container et qui applique une fonction ou methode à chaque élement du conteneur
       walker(UneFonctionGenerique) //UneFonctionGenerique = n'importe quelle fonction valable pour la structure de données A. Comment faire ??
       {
        std::vector<A*>::iterator aIter;
        for(aIter=vectorA.begin(); aIter!=vectorA.end();aIter++)
                UneFonctionGenerique(*aIter); //je n'ai aucune idée de comment faire ça
       }
     
    };
     
    funtion displayNumber1() //je ne connais la tête que cette fonction peut avoir, mais je suis libre de l'implementer
    {
          std::cout<<_number1; //???
    }
     
    int main()
    {
    //blablabla...
    Container myContainer;
    myContainerDeA.walker(displayNumber1);
    //....
    }
    Merci bcp de votre aide !!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Bon, déja on ne parle pas de "funtors" mais de foncteurs. Ensuite, ils sont expliqués ici:http://cpp.developpez.com/cours/cpp/...page_16#LXVI-E
    Pour un code qui fonctionnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class F>
    walker(const F& UneFonctionGenerique) //UneFonctionGenerique = n'importe quelle fonction valable pour la structure de données A. Comment faire ??
       {
        std::vector<A*>::iterator aIter;
        for(aIter=vectorA.begin(); aIter!=vectorA.end();aIter++)
                UneFonctionGenerique(*aIter); //je n'ai aucune idée de comment faire ça
       }
    Ca c'est en admettant que le foncteur en question puisse être déterminé à la compilation. A l'exécution, c'est plus hard. Tu as plusieurs solutions:
    - utiliser des pointeurs de fonction (comme en C)
    - faire une interface pour tes fonctions (simuler du fonctionnel avec de l'OO comme en Java)
    - utiliser boost::function

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    La STL te fournit tout un ensemble de fonctions génériques pour parcourir ses conteneurs. A l'utilisateur d'implémenter ensuite ce qui doit être fait lors du parcours via ce qu'on appelle un foncteur. Un coup d'oeil dans la documentation de la STL t'aidera à comprendre cette notion.

    Exemple:

    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
     
    #include <iostream>
    #include <vector>
     
    using namespace std;
     
    class A {
    public :
      A(int i1, int i2)  : number1 (i1),
    		       number2 (i2) {};
      void displayNumber1 () const {
        cout << number1 << endl;
      }
    private : 
      int number1, number2;        
    };
     
    std::vector<A *> vectorA;
     
    // Foncteur d'affichage d'un A*
    struct display1 : public unary_function <A*, void> {
      void operator () (const A * a) {
        a->displayNumber1 ();
      }
    };
     
    typedef std::vector<A *> AVector;
     
    int main() {
      AVector va;
      va.push_back (new A (2, 3));
      va.push_back (new A (5, 6));
      // Parcours du vecteur avec affichage pour chaque élément
      for_each (va.begin(), va.end(), display1 ());
      return 0;
    }

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

Discussions similaires

  1. replication d'objet dans un container STL
    Par istdasklar dans le forum SL & STL
    Réponses: 12
    Dernier message: 15/05/2007, 23h04
  2. Onmouseover sur elements imbriqués
    Par HwRZxLc4 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 12/04/2007, 15h40
  3. [JDOM]Element names cannot contain colons.
    Par mrbungle dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 15/03/2007, 14h15
  4. Localisation visiteurs sur sont site ..
    Par boodhir dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2007, 14h35
  5. evenement onmouseover sur element HTML disabled
    Par danyboy85 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/04/2006, 12h04

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