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 :

[Vector] Copie des éléments lors d'un push_back() ?


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Par défaut [Vector] Copie des éléments lors d'un push_back() ?
    Bonjour,

    J'ai un objet Data qui est relativement gros, et dans une méthode je le modifie puis le stocke dans un vector.

    Mais il se passe quelque chose qui me parait bizarre : lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_vector.push_back(mon_data);
    Il fait un nombre de copies variables de mon objet. J'ai affiché quelque chose dans le constructeur de copie, et je remarque qu'il fait 1, puis 2, puis 3, puis 1, puis 5, puis parfois même 10 appels à ce constructeur juste lorsqu'il fait push_back.

    Comme mon objet est gros, ça ralentit beaucoup l'exécution, j'aimerai comprendre ce qui se passe et pouvoir l'éviter. Je pensais qu'il n'en ferait qu'une seule copie !

    Merci d'avance !

  2. #2
    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,

    Si la copie est gourmande la solution traditionnelle est de stocker des pointeurs et non des objets directement dans le conteneur.

    MAT.

  3. #3
    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 5kippy Voir le message
    Bonjour,

    J'ai un objet Data qui est relativement gros, et dans une méthode je le modifie puis le stocke dans un vector.

    Mais il se passe quelque chose qui me parait bizarre : lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mon_vector.push_back(mon_data);
    Il fait un nombre de copies variables de mon objet. J'ai affiché quelque chose dans le constructeur de copie, et je remarque qu'il fait 1, puis 2, puis 3, puis 1, puis 5, puis parfois même 10 appels à ce constructeur juste lorsqu'il fait push_back.

    Comme mon objet est gros, ça ralentit beaucoup l'exécution, j'aimerai comprendre ce qui se passe et pouvoir l'éviter. Je pensais qu'il n'en ferait qu'une seule copie !

    Merci d'avance !
    C'est surment par ce qu'il fait une allocation memoire et du coup une recopie. Si tu connait a peu prés la taille max que pourra pré allouer un espace qui sera suffissant pour ton vector.

    mon_vector.reserve(NB_MAX);//reserve la memoire

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Citation Envoyé par 5kippy Voir le message
    Il fait un nombre de copies variables de mon objet. J'ai affiché quelque chose dans le constructeur de copie, et je remarque qu'il fait 1, puis 2, puis 3, puis 1, puis 5, puis parfois même 10 appels à ce constructeur juste lorsqu'il fait push_back.
    Quand tu fais un push_back, le vecteur peut avoir besoin d'augmenter la capacité du vecteur. Les différents appels au constructeur de copie que tu vois ne sont là que pour initialiser les nouvelles cases de ton vecteur. Autrement, il n'y a qu'un seul appel au constructeur de copie pour l'objet que tu es en train d'ajouter.

    Autrement, même remarque que Mat007 (EDIT: et que MonGaulois)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2007
    Messages : 15
    Par défaut
    Ouah, merci pour la rapidité de réponse ! ça marche nickel en précisant la taille max au début !

    Merci beaucoup !

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

Discussions similaires

  1. Supprimer des éléments consécutifs dans un vector
    Par Pg043 dans le forum SL & STL
    Réponses: 6
    Dernier message: 10/12/2008, 23h19
  2. réduction/changement de position des éléments lors du recadrage de la fenetre
    Par emirdagli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 20/11/2008, 10h58
  3. Réponses: 2
    Dernier message: 12/01/2008, 23h50
  4. [Excel] Supprimer des leins lors de copies d'onglet
    Par marsupilami34 dans le forum Excel
    Réponses: 9
    Dernier message: 26/07/2007, 10h36
  5. Réponses: 6
    Dernier message: 01/09/2006, 18h04

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