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 :

comment effacer des lignes ou colonne de vector 2D ?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut comment effacer des lignes ou colonne de vector 2D ?
    Bonjour tous,
    je voudrais savoir comment on fait pour supprimer tout le contenu d'un vector 2D ??
    je vous demande cela car voici le programme que j'ai fais:
    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
     
    #include <iostream>
    #include <vector>
    using namespace std;
    int main()
    {
        vector <double> AAA;
        vector < vector <double> > BBB;
     
        for ( int i=0 ; i<5 ;i++ )
        {
            AAA.push_back(i);
        }
        for ( int i=0 ; i<2 ;i++ )
        {
            BBB.push_back(AAA);
        }
        for ( int k=0 ; k<2 ;k++ )
        {
            for ( int i=0 ; i<5 ;i++ )
            {
                cout << "result" << BBB[k][i] << endl;
            }
        }
        for ( int k=0 ; k<2 ;k++ )
        {
                BBB[k].clear();
        }
        for ( int k=0 ; k<2 ;k++ )
        {
            for ( int i=0 ; i<5 ;i++ )
            {
                cout << "BBB " << BBB[k][i] << endl;
            }
        }
        return 0;
    }
    je m'attendais à ce que le contenu de BBB soit vide mais il n'en ai rien il y a les memes valeurs qu'avant?!!!

    j'ai essayé aussi de remplacer:
    par
    mais j'ai toujours des résultats dans BBB

    j'espere que vous pourrez m'aider

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    salut, c'est étonnant que

    ne fonctionne pas... Peux-tu nous monter ton code STP ?

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    la fonction membre clear() ne fait qu'appeler le destructeur des éléments du vecteur. Et du coup, il me semble que dans le cas de types natif, il ne va rien faire du tout (à vérifier). Mais ce qui est sûr, c'est que clear() ne modifie pas la taille du conteneur (ie. le nombre d'éléments contenus).

    Pour réellement libérer la mémoire utilisée par ton vecteur, il y a plusieurs façons de faire. Voici celles qui me viennent à l'esprit:
    1. Sortir de la portée. Si les élements contenus dans ton vecteur ne sont pas des pointeur, et que ton vecteur lui-même n'est pas un pointeur, il suffit de sortir de la portée pour que soit dépilé la pile et ainsi la mémoire automatiquement libérée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    { // on entre dans le bloc
       std::vector v;
       // on met des choses dans le vecteur
       } // on sort du bloc: ici v sera automatiquement effacé
    2. utiliser le "swap trick":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::vector v;
    // on remplis le vecteur
    std::vector().swap( v );
    ce que fait la dernière ligne est: création d'un vecteur vide et remplacement en mémoire du vecteur v par ce vecteur vide. Il me semble que ce trick est expliqué en détail sur la faq.lite


    Après, peut-être que la fonction membre erase() pourrait être utile pour ton problème, selon la nature exacte de celui-ci.

    A noter également que lorsque tu rempli un vecteur, puis que tu le détruis, en général les éléments détruits ne le sont pas. C'est juste la taille du vecteur qui change. Ce qui signifie, concrètement, que si tu regardes ce qu'il y a en mémoire après la destruction, il y a aura toujours la même chose qu'avant.
    Autre chose, il ne faut pas confondre supression des élément et réinitialisation (à 0 par exemple).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par r0d Voir le message

    la fonction membre clear() ne fait qu'appeler le destructeur des éléments du vecteur. Et du coup, il me semble que dans le cas de types natif, il ne va rien faire du tout (à vérifier). Mais ce qui est sûr, c'est que clear() ne modifie pas la taille du conteneur (ie. le nombre d'éléments contenus).
    std::vector::clear() détruit le contenu du vecteur ; sa taille est alors 0. Ce que std::vector::clear() ne modifie pas c'est sa capacité.

    Et le code de 21did21 a un comportement indéfini puiqu'il accède à des éléments détruits.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par N i h i l Voir le message
    std::vector::clear() détruit le contenu du vecteur ; sa taille est alors 0. Ce que std::vector::clear() ne modifie pas c'est sa capacité.
    Effectivement, tu as raison. J'ai répondu un peu vite.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    quand je fais ceci:
    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
     
    vector <double> AAA;
        vector < vector <double> > BBB;
     
        for ( int i=0 ; i<5 ;i++ )
        {
            AAA.push_back(i);
        }
        for ( int i=0 ; i<2 ;i++ )
        {
            BBB.push_back(AAA);
        }
        for ( int k=0 ; k<2 ;k++ )
        {
            for ( int i=0 ; i<5 ;i++ )
            {
                cout << "result" << BBB[k][i] << endl;
            }
        }
     
     
    BBB.clear();
    for ( int k=0 ; k<2 ;k++ )
    {
        cout << "size " << BBB[k].size() << endl;
    }
    voici le resultat: piece jointe

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    quand je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     // ...
    BBB.clear();
    Ici, BBB est vide.

    Or,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for ( int k=0 ; k<2 ;k++ )
    {
        cout << "size " << BBB[k].size() << endl;
    }
    ton code accède à BBB[k] ; c'est un comportement indéfini.

    Et,
    voici le resultat:
    le code compilé est autorisé à faire ce qu'il veut...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci Nihil de prendre le temps de me repondre

    Citation Envoyé par N i h i l Voir le message
    Ici, BBB est vide.
    Or,
    ton code accède à BBB[k] ; c'est un comportement indéfini.
    je ne comprends pas ce que tu veux dire par "comportement indéfini."

    Citation Envoyé par N i h i l Voir le message
    Et,
    le code compilé est autorisé à faire ce qu'il veut...
    je ne comprends pas trop ce que tu veux dire par là

  9. #9
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Comportement indéfinie, c'est que tu ne peux pas prévoir ce que va faire ton code, il peut marcher, comme pas du tout (message d'erreur de l'OS par exemple).

    Dnas ton cas c'est car tu fais un tableau, tu le vides et tu demande d'accéder à une case qui n'existe plus, dans ce cas il n'y a pas d'erreur apparente mais ca risque de mal se passer.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Comportement indéfinie, c'est que tu ne peux pas prévoir ce que va faire ton code, il peut marcher, comme pas du tout (message d'erreur de l'OS par exemple).
    Dnas ton cas c'est car tu fais un tableau, tu le vides et tu demande d'accéder à une case qui n'existe plus, dans ce cas il n'y a pas d'erreur apparente mais ca risque de mal se passer.
    d'accord merci.

    juste pour être certain que j'ai bien compris:
    ==> si je fais BBB.clear() ca va me effecer tout le contenu de BBB même si c'est un tableau 2D et je dois juste faire attention par la suite de ne pas acceder à des elements vides

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Oui c'est bien ça.
    En fait, quand tu détruis un ou des objets, il ne faut plus essayer d'y accéder, sinon c'est un comportement indéfini (on ne peut pas savoir ce qui va se produire).
    Ce qui se passait dans ton programme, c'est que le clear désallouait la mémoire, mais n'en modifiait pas le contenu. Donc quand tu y accèdes après le clear, les données étaient encore là. Mais il n'y a aucune raison pour qu'il se passe la même chose dans un autre contexte (par exemple si tu rajoutes du code entre les deux, si tu changes les options de compilation, si tu exécute ce code sur un autre compilateur, etc.).
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    quel super forum!

    merci tous pour votre aide (une fois de plus)

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

Discussions similaires

  1. Comment filtrer des lignes sur la valeur d'une colonne
    Par BerBiX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/06/2010, 13h46
  2. Comment mettre des lignes en colonnes?
    Par flostralian dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/05/2009, 20h34
  3. Réponses: 1
    Dernier message: 01/08/2008, 19h51
  4. comment comparer des lignes ou des colonnes
    Par juldace dans le forum SQL
    Réponses: 3
    Dernier message: 29/05/2007, 12h43
  5. comment je peux effacer des lignes
    Par aliwassem dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/03/2006, 19h05

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