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 :

besoin d'aide pour "configurer" un std::vector


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut besoin d'aide pour "configurer" un std::vector
    Bonjour.

    J'ai du mal a bien comprendre comment fonctionne la fonction find_if avec un std::vector. Le but, dans mon cas, étant de trouver un objet contenue dans un vector grâce à un de ses attributs ( un id ) au lieu de l'objet lui même.
    En fait, je voudrais simplement faire la même chose qu'avec un std::map/unordered_map etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    auto it = m_myContainer.find ( id ) ;
     
    it -> second.doSomething() ;
    Connaissez vous une methode simple et optimisé pour ce faire ? La surcharge d'opérateur est-elle la solution ?

    Merci si vous pouvez m'aider

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Bonjour, tu as un très bon exemple d'usage sur cppreference :
    Code C++ : 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
     
    // find_if example
    #include <iostream>     // std::cout
    #include <algorithm>    // std::find_if
    #include <vector>       // std::vector
     
    bool IsOdd (int i) {
      return ((i%2)==1);
    }
     
    int main () {
      std::vector<int> myvector;
     
      myvector.push_back(10);
      myvector.push_back(25);
      myvector.push_back(40);
      myvector.push_back(55);
     
      std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
      std::cout << "The first odd value is " << *it << '\n';
     
      return 0;
    }

    Source : http://www.cplusplus.com/reference/algorithm/find_if/

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Merci pour ta réponse, prgasp77

    Dsl, c'est peut être moi, mais je comprends toujours pas. Mon objet contenu dans le vector n'est pas un int, mais un objet, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    struct Object 
    {
         size_t id ;
         float x , y ;
    }
    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
     
     
        std::vector < Object > model ;
     
        Object m1 ;
        m1.id = 1 ;
        m1.x = 17 ;
        model.push_back( m1 ) ;
        Object m2 ;
        m2.id = 2 ;
        m2.x = 112 ;
        model.push_back( m2 ) ;
        Object m3 ;
        m3.id = 3 ;
        m3.x = 45 ;
        model.push_back( m3 ) ;
     
        std::vector < Object > :: iterator it = std::find_if ( model.begin(), model.end() , ..?? ) ;

  4. #4
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Prends le temps d'étudier et de comprendre l'exemple, ne cherche pas une solution clé en main. Regarde la fonction IsOdd et comment celle-ci est passée à find_if. Lis la documentation que je t'ai référencée. Toutes les réponses sont là .

    Une variante serait effectivement d'utiliser une std::map si tu fais de nombreuses recherches.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    J'ai beau relire, j'ai toujours du mal

    Une variante serait effectivement d'utiliser une std::map si tu fais de nombreuses recherches.
    Nombreux son ceux qui m'ont dit que le std::map/unordered_map etc...étaient moins performants et de loin qu'un std::vector, voila pourquoi je tends vers le vector, mais encore un fois je ne parviens pas bien à saisir le concept de find_if, prédicat et foncteur, pourtant indispensable pour mon programme.
    Dans mon cas, par ex, devrais-en en arriver à utiliser un std::bind1st, par ex ?
    Ou, comme tu sembles le dire, tous les ingrédients son là ?

    Merci si vous pouvez m'aider

  6. #6
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    find_if(begin, end, pred) te retourne un itérateur vers le premier élément de la plage [begin, end[ qui vérifie pred. C'est exactement ce que tu veux ; il te reste à écrire le prédicat. Procédons par étape si tu le veux. Écris une fonction libre (ie pas membre d'une classe) qui prenne une référence constante vers un Objet et qui retourne true si et seulement si son id est 42 (en dur pour l'instant). Pousse donc quelques Objets dans v (dont un avec id=42) et vois ce que donne auto it = std::find_if(v.begin(), v.end(), pred42);.


    Concernant cette histoire d'optimisation, tu as des questions à te poser :
    • As tu des contraintes de performances avérées ?
    • Sais-tu dans quel(s) cas la performance des std::vector était supérieure à std::map ?
    • Sais-tu dans quelle mesure ?
    • As-tu identifié des problèmes de performance sur une première version de ton logiciel ?
    • As-tu profilé ton code et identifié l'usage de std::map comme étant la cause de ces ralentissements ?

    Si la réponse à une de ces questions est non (juste une), utilise la structure la plus "pratique", quitte à changer ensuite. Je te propose de terminer l'usage de find_if avec des vector comme exercice, mais il est probable que tu ais besoin d'une map-like.

Discussions similaires

  1. Besoin d'aide pour la configurer basic de postfix
    Par pierrot10 dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 18/03/2014, 11h33
  2. [ZF 1.5] [Route] Besoin d'aide pour la configuration des mes routes => url propre
    Par Jonathan.b dans le forum Zend Framework
    Réponses: 5
    Dernier message: 29/10/2008, 14h27
  3. [Serveur] Besoin d'aide pour configuration
    Par rigel dans le forum Ordinateurs
    Réponses: 8
    Dernier message: 19/09/2006, 10h29

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