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 :

Copie d'un vector dans un autre vector


Sujet :

C++

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Copie d'un vector dans un autre vector
    Bonjour,
    Je souhaiterias copier un vector dans un autre vector de la manière suivante:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <vector>
    class Foo
    {
      public:
        void copyVector(std::vector<double> inputVector);
      protected:
        std::vector<double> m_vect;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "Foo.h"
    void Foo::copyVector(std::vector<double> inputVector)
    {
      // 1. m_vect = inputVector;
      // ou
      // 2. copy(inputVector.begin(), inputVector.end(), m_vect.begin());
    }
    Quelles est la meilleur pratique? Sont-elles equivalentes?
    Sachant que je souhaite uniquement copier le contenue et non la référence.

    MErci de votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 123
    Points : 33 023
    Points
    33 023
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    étant donné comment est foutu std::vector, il suffit tout simplement d'utiliser l'opérateur =.
    Btw, la seule vraie bonne pratique, tu ne l'as pas appliquée : le paramètre en const&
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Justement je voulais éviter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void copyVector(const std::vector<double>& inputVector);
    Pour ne pas copie la référence.

    Me trompe-je?

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 159
    Points
    3 159
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Pour ne pas copie la référence.
    ? C'est à dire ?

    Si tu ne copies pas une référence (c'est à dire un pointeur d'un point de vue implémentation), tu copieras le vecteur complet une fois supplémentaire, pour rien.
    Find me on github

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Pour éviter que par la suite si est modifé, cela n'impacte pas ma copie avant modification de l'original.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Quand tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "Foo.h"
    void Foo::copyVector(std::vector<double>& inputVector)
    {
       m_vect = inputVector;
    }
    Tu appelle l'opérateur de copie de la classe std::vector, qui se charge de recopier l'intégralité du contenu du vecteur source dans le vecteur de destination. Tu te retrouve alors bel et bien avec deux vecteurs dissociés uniques, ayant simplement le même contenu. Si tu modifies l'un des deux par la suite, l'autre ne sera pas affecté.

    Gaffe par contre, si ton vecteur contient par exemple des pointeurs (ce n'est pas le cas dans ton exemple mais je précise au cas où), l'opérateur de copie de std::vector se contente alors bêtement de faire une copie de ce pointeur et non de son contenu. On se retrouve alors avec deux vecteur uniques, mais qui partagent des pointeurs vers des valeurs communes. Par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::vector< double* > v1;
    std::vector< double* > v2;
    double* d_ptr;
     
    *d_ptr = 0;
    v1.push_back( d_ptr );
    v2 = v1; // On a bien deux vecteurs uniques.
    *d_ptr = 1; // modifie la valeur de d_ptr pour v1 ET v2, puisqu'ils partagent un pointeur sur la même valeur.
    Et concernant le const, oui tu devrais l'utiliser dans ton cas, puisque comme tu fais une copie d'input_vector, tu ne le modifies pas.

  7. #7
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par LinuxUser Voir le message
    Justement je voulais éviter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void copyVector(const std::vector<double>& inputVector);
    Pour ne pas copie la référence.

    Me trompe-je?
    Oui, c'est pas du Java
    Ton vector sera copié.
    Si jamais tu voulais copier la référence, il aurait fallu déclarer m_vect comme référence.

  8. #8
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Je suis démasqué, en effet je viens du Java() et je me mets au C++ là.
    Merci beaucoup pour votre aide, je corrige à présent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "Foo.h"
    void Foo::copyVector(const std::vector<double>& inputVector)
    {
      m_vect = inputVector;
    }

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 123
    Points : 33 023
    Points
    33 023
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Si jamais tu voulais copier la référence, il aurait fallu déclarer m_vect comme référence.
    Ce qui est impossible puisqu'une référence doit être immédiatement initialisée à sa déclaration !
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Sans être expert en Java (et c'est un euphémisme...), j'imagine que Java implémente le vecteur en utilisant le COW, similaire à QVector de Qt. Voir la FAQ Qt - Comment Qt optimise-t-il les copies ? pour le principes

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 159
    Points
    3 159
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Sans être expert en Java (et c'est un euphémisme...), j'imagine que Java implémente le vecteur en utilisant le COW, similaire à QVector de Qt. Voir la FAQ Qt - Comment Qt optimise-t-il les copies ? pour le principes
    C'est plus simple que ça : en Java, on ne manipule que des poignées sur les objets, la notion de pointeur n'existe pas, tout les passages d'arguments se font par référence sauf dans le cas des types intrinsèques (int, bool, etc).
    Find me on github

  12. #12
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Ah oui, j'avais oublié ce bug cette particularité du Java

    (merci de pas rentrer dans mon troll, il est trop gros )

  13. #13
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Ce qui est impossible puisqu'une référence doit être immédiatement initialisée à sa déclaration !
    Il faudrait juste l'initialiser dans le constructeur, mais il est toujours possible de modifier cette référence après.

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 123
    Points : 33 023
    Points
    33 023
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Il faudrait juste l'initialiser dans le constructeur, mais il est toujours possible de modifier cette référence après.
    Non. Il est impossible de réassigner une référence.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Oups, c'est vrai qu'en y réfléchissant je vois pas la syntaxe que ça pourrait avoir.

    Je me coucherai moins con ce soir

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/05/2007, 08h57
  2. [VBA Excel] Copie d'une feuille dans un autre fichier
    Par nattyman dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/08/2006, 10h35
  3. [Oracle XE] Copie d'un schéma dans un autre
    Par rozwel dans le forum Oracle
    Réponses: 8
    Dernier message: 19/12/2005, 19h20
  4. [Vector] Ajouter un Vector dans un autre Vector
    Par VinceFromBcn dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 30/06/2004, 21h54
  5. Copie d'un flux dans un autre
    Par Morvan Mikael dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2003, 09h40

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