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 :

Taille d'un vecteur


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut Taille d'un vecteur
    Bonsoir,
    j'ai cherché partout ca n'a pas résolu mon problème : pour enlever un élément, le vecteur devrait réduire sa taille d'une unité.
    J'ai beau faire un resize il garde toujours la même taille et même avec un pop_back(), un erase etc...
    Comment retirer définitivement un élèment du vecteur et réduire sa taille consécutivement ?

  2. #2
    Invité
    Invité(e)
    Par défaut

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les opérations que tu cites réajustent bien la taille du vecteur. Si c'est de la mémoire allouée dont tu parles, il y a une astuce pour ajuster celle-ci, mais en général garder la mémoire allouée est une meilleure stratégie.

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    J'ai essayé d'opter pour la solution de la faq c'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <string>
    #include <vector>
    #include <algorithm>
     
     
    std::vector v;
    v.erase(std::remove_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 3)), v.end());
    Mais j'ai un problème et je sais même pas si cette solution marchera mais dans algo.h : erreur à chaque condition : if (!__prec(*__first)) car appel d'une non fonction
    Est-ce la solution ?

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tu commençais par nous dire ce que tu cherches à faire, exactement ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    C'est tout simple !
    Juste supprimer une instance dans le vecteur et reajuster la taille (size() du vecteur

    Ca donne 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
    27
    28
    29
    30
     
    class CItem
    {
    public:
              CItem() {}
              // Variables etc...
    };
    class CClient
    {
    public:
              CClient() {}
              void Supprimer(int n);
              std::vector < CItem > Courses;
              // variables etc...
    };
    ///////////////////////////////////////////
    void CClient::Supprimer(int n)
    {
              // Enlever un CItem PRECIS (article)
              this->Courses.erase(this->Courses[n]);
     
              // Echange du dernier élément avec l'élément n ( cela causera 
              // peut etre problème étant donné qu'on a déjà effacé l'élément n
     
              CItem *pItem = this->Courses.end();
              this->Courses[n] = pItem;
     
              // pour réajuster le vecteur
              this->Courses.pop_back();      
    }
    Bien entendu ca ne marche pas
    J'espère que vous avez compris ce que je voulais tout simplement faire

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Lorsque tu fais un 'erase' les éléments sont décalés pour combler le 'trou'.
    Donc dans ton code lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->Courses[n] = pItem;
    Tu écrases potentiellement le nouvel élément 'n'.

    De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CItem *pItem = this->Courses.end();
    end() ne donne pas du tout le dernier élément mais est une sorte de 'faux' élément qui se trouve après tous les éléments.
    Du coup pItem vaut potentiellement n'importe quoi.

    Et finalement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->Courses.pop_back();
    retire le dernier élément, ça n'a rien à voir avec un quelconque réajustement...

    Il n'y a pas du tout besoin de réajuster quoique ce soit, tu fais juste un 'erase' et voilà.
    Attention par contre à bien libérer les objets alloués et stockés par pointeur dans ton vecteur.

    En résumé : lis la FAQ sur les conteneurs dont le lien t'as été donné dans la première réponse :p

    MAT.

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    Merci en tout cas !

    Donc si je comprend bien d'abord un appel du destructeur de l'instance et ensuite une erase sur le même élément ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int i; 
    std::vector < Classe > Vector;
    Vector[i].~Classe();
    Vector.erase(&Vector[i]);
    Il n'y a pas du tout besoin de réajuster quoique ce soit, tu fais juste un 'erase' et voilà.
    Attention par contre à bien libérer les objets alloués et stockés par pointeur dans ton vecteur.
    C'est bien le destructeur qu'il faudra appeler pour libérer la mémoire ou resize ou...?

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Julien_C++
    C'est bien le destructeur qu'il faudra appeler pour libérer la mémoire ou resize ou...?
    Je voulais dire que, si tu as fait un 'new' pour créer les objets que tu stockes par pointeur dans ton vecteur, il faut faire vraisemblablement un 'delete' quand tu les retires si tu n'en as plus besoin.
    Et si tu n'as pas fait de 'new' et que tu stockes des pointeurs dans un vecteur c'est qu'il y a un problème

    MAT.

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 94
    Par défaut
    Bon il me semble que j'ai compris et je vous remercie tous pour les solutions et surtout explications apportées
    Merci Merci et Merci

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

Discussions similaires

  1. Réduire la taille d'un vecteur de très grande dimension
    Par camboui dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 07/06/2017, 13h23
  2. [Débutant] Avoir la Taille d'un Vecteur
    Par kheira dans le forum C++Builder
    Réponses: 6
    Dernier message: 14/03/2010, 18h26
  3. Problème de changement de taille d'un vecteur
    Par arfi64 dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/06/2007, 14h56
  4. Réponses: 5
    Dernier message: 14/06/2006, 15h05
  5. Réponses: 5
    Dernier message: 30/01/2006, 12h10

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