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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    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é
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    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).

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    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é
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    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.

  6. #6
    Membre éprouvé
    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
    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 éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    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...

+ 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