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 :

questrion sur le remove_if erease et contenaire


Sujet :

SL & STL C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut questrion sur le remove_if erease et contenaire
    Bonjour,
    dans la faq,
    il existe ce code pour enlever les element d'un contenaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector v;
    v.erase(std::remove_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 3)), v.end());
    En y reflechissant, pourquoi cela est correcte??
    avant le erase, std::remove_if et v.end sont appelé l'un aprés l'autre. Seulement es ce bien sur que ce soit dans cette ordre?
    Par exemple si v.end() est appelé en premier puis remove_if, le resultat de v.end est erroné!!
    Pour un vector ca va souvent marcher car les iterator sont souvent un simple pointeur et que la memoire est contigue.
    Mais pour les autres???

    ce code me semble plus correcte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::unContenaire<x>::iterator newEnd = std::remove_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 3));
    v.erase(newEnd , v.end());

  2. #2
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    Tu as tout à fait raison car il me semble que les arguments sont empilés dans l'ordre inverse de leur déclaration.

    Le petit code suivant :
    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
    int fa()
    {
        cout << "Appel de fa()\n";
        return 0;
    }
     
    int fb()
    {
        cout << "Appel de fb()\n";
        return 0;
    }
     
    void fc(int x, int y)
    {}
     
    int main(int argc, char *argv[])
    {
        fc(fa(),fb());
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    donne ceci avec DEV-C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Appel de fb()
    Appel de fa()
    Appuyez sur une touche pour continuer...
    On voit bien que le 2eme argument est évalué en 1er.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Bonjour,
    dans la faq,
    il existe ce code pour enlever les element d'un contenaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector v;
    v.erase(std::remove_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 3)), v.end());
    En y reflechissant, pourquoi cela est correcte??
    avant le erase, std::remove_if et v.end sont appelé l'un aprés l'autre. Seulement es ce bien sur que ce soit dans cette ordre?
    Absolument pas, v.end() peut être appelé avant, pendant ou après remove_if.

    Citation Envoyé par Mongaulois Voir le message
    Par exemple si v.end() est appelé en premier puis remove_if, le resultat de v.end est erroné!!
    Non. Et c'est pour ça que ça marche. Le code suivant marcherait aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::unContenaire<x>::iterator oldEnd = v.end();
    std::unContenaire<x>::iterator newEnd = std::remove_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 3));
    v.erase(newEnd , oldEnd);
    remove_if le mal nommé ne joue en aucun cas su le nombre d'éléments d'un conteneur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par jmv Voir le message
    Tu as tout à fait raison car il me semble que les arguments sont empilés dans l'ordre inverse de leur déclaration.
    Quelques soit l'ordre d'empilement (qui dépend de la plate forme), l'ordre d'évaluation des arguments d'une fonction est absolument non spécifié et peut varier d'un appel à l'autre dans le même code. Dans le code suivant :
    L'ordre suivant est un des nombreux ordres d'appel valides :
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Absolument pas, v.end() peut être appelé avant, pendant ou après remove_if.
    Si v.end() est appelé en premier, il donne un iterateur sur un element désignier comme le dernier.
    Ensuite remove_if eest appel et change la position du dernier élément. Donc l'iterateur qu'avais donné v.end() precedement n'est plus valide.
    non?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Ensuite remove_if eest appel et change la position du dernier élément.
    remove_if ne change aucune position d'élément, il change le contenu des éléments, et recopie certaine cases du conteneur dans d'autres.

    Le dernier élément reste le dernier, il n'a juste pas forcément la même valeur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    remove_if ne change aucune position d'élément, il change le contenu des éléments, et recopie certaine cases du conteneur dans d'autres.

    Le dernier élément reste le dernier, il n'a juste pas forcément la même valeur.
    Ha ok, je comprend mieux.
    merci beaucoup

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

Discussions similaires

  1. Débat sur l'I.A (Intelligence Artificielle)
    Par Anonymous dans le forum Intelligence artificielle
    Réponses: 457
    Dernier message: 05/07/2016, 01h11
  2. Documentation gratuite sur l'API Windows, COM, DCOM, OLE, etc.
    Par Community Management dans le forum Windows
    Réponses: 1
    Dernier message: 16/11/2006, 15h28
  3. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59
  4. Réponses: 4
    Dernier message: 27/03/2002, 11h03
  5. F.A.Q, Doc, cours, tutoriels sur JBuilder
    Par Ricky81 dans le forum JBuilder
    Réponses: 0
    Dernier message: 14/03/2002, 15h28

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