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 :

Pointeur shared_ptr et remove_copy_if


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut Pointeur shared_ptr et remove_copy_if
    Bonjour,

    J'essaye de comprendre le fonctionnement de cet exemple 3 :

    https://learn.microsoft.com/fr-fr/cp...?view=msvc-170

    dont le code est le suivant, je ne comprends pas très bien la partie que j'ai mis en gras/italique :

    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
    vector<shared_ptr<Song>> v {
      make_shared<Song>(L"Bob Dylan", L"The Times They Are A Changing"),
      make_shared<Song>(L"Aretha Franklin", L"Bridge Over Troubled Water"),
      make_shared<Song>(L"Thalía", L"Entre El Mar y Una Estrella")
    };
    
    vector<shared_ptr<Song>> v2;
    remove_copy_if(v.begin(), v.end(), back_inserter(v2), [] (shared_ptr<Song> s) 
    {
        return s->artist.compare(L"Bob Dylan") == 0;
    });
    
    for (const auto& s : v2)
    {
        wcout << s->artist << L":" << s->title << endl;
    }
    Premièrement, je ne comprends pas ce que sont les crochets vides devant le pointeur...ça laisserait penser qu'on veut convertir en tableau comportant des binaires pour valider ou non l'insertion dans v2 !? D'habitude pour un tableau les crochets sont après comme int [], on ne fait pas [] int !? A moins que ça soit une façon de faire du cast...? genre (int) a pour convertir a en int, ici on ferait [] a pour convertir en tableau !?

    Et le return j'ai du mal à le comprendre dans ce contexte, je l'utilise dans des fonctions classiques, pas comme ça...


    Par contre, je comprends très bien cet 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
    #include <iostream>     // std::cout
    #include <algorithm>    // std::remove_copy_if
    #include <vector>       // std::vector
     
    bool IsOdd (int i) { return ((i%2)==1); }
     
    int main () {
      int myints[] = {1,2,3,4,5,6,7,8,9};
      std::vector<int> myvector (9);
     
      std::remove_copy_if (myints,myints+9,myvector.begin(),IsOdd);
     
      std::cout << "myvector contains:";
      for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
        std::cout << ' ' << *it;
      std::cout << '\n';
     
      return 0;
    }
    C'est vraiment, le 4ème argument du 1er exemple qui me perturbe au niveau de la syntaxe... j'imagine dans le 4ème argument que ce qui est entre accolades sert à initialiser le tableau si mon hypothèse est bonne via le return en le remplissant de booleens...pas simple à comprendre cette écriture condensée...

    Bon weekend.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Lambda expressions, et + précisément Lambda capture, documentation cppreference.com en anglais.

    En gros cela définit comment sont capturés les paramètres : [] par copie @Bousk me dit pas de capture, [&] par référence, [=] par copie (<- si je ne me trompe pas )


    Édit: tu ne comprends pas que le 4ième paramètre est 1 lambda/ fonction anonyme. Cela est possible depuis C+11
    documentation cplusplus.com en anglais de std::remove_copy_if : effectivement c'est dit "either be a function pointer or a function object.". "function object" veut sûrement dire au moins lambda.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 60
    Points : 47
    Points
    47
    Par défaut
    Ah d'accord, j'ai vu les fonctions lambda il y a quelques semaines mais je n'ai pas fait le rapprochement sur cet exemple ! Effectivement, je comprends mieux. Je m'étais exercé un peu dessus (les fonctions lambdas), mais j'ai englouti tellement de cours et de codes en 1 mois (2 à 12 heures par jour) que je manque de recul et d'expérience...
    Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    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 115
    Points : 32 963
    Points
    32 963
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    [] par copie, [&] par référence, [=] par copie (<- si je ne me trompe pas )
    quand c'est vide, rien n'est capturé
    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.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 02/10/2011, 12h56
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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