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<maClasse> et copie


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut vector<maClasse> et copie
    Salut,

    A quelle condition la copie suivante peut-elle fonctionner comme attendu (c'est à dire copier proprement le contenu de chaque élément maClasse du vector source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    vector<maClasse> a;
    vector<maClasse> b;
    maClasse c1;
    maClasse c2;
     
    a.push_back(c1);
    a.push_back(c2);
     
    b = a;
    J'imagine qu'on passe par une certaine opération de copie définie sur maClasse qu'il faut que je redéfinisse, mais laquelle ?

    Merci

  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,

    Citation Envoyé par tnarol Voir le message
    J'imagine qu'on passe par une certaine opération de copie définie sur maClasse qu'il faut que je redéfinisse, mais laquelle ?
    L'opérateur d'affectation (et le constructeur par copie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class maClass
    {
    public:
      maClass( const maClass& rhs )
      {
        ...
      }
      maClass& operator=( const maClass& rhs )
      {
        ...
        return *this;
      }
    };
    MAT.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,


    L'opérateur d'affectation (et le constructeur par copie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class maClass
    {
    public:
      maClass( const maClass& rhs )
      {
        ...
      }
      maClass& operator=( const maClass& rhs )
      {
        ...
        return *this;
      }
    };
    MAT.
    Je me doutais que c'était sûrement un des deux mais je n'imaginais pas les deux... pourriez-vous m'expliquer pourquoi ils sont nécessaires ?

  4. #4
    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
    Et bien l'implémentation peut utiliser l'opérateur d'affectation pour écraser des éléments existants et le constructeur par copie ajouter de nouveaux éléments.
    Mais je ne crois pas qu'il y ait quoique ce soit de spécifié dans le standard sur l'algorithme lui-même, par exemple l'implémentation peut aussi utiliser des placement new avec le constructeur par copie à la place de l'opérateur d'affectation (je crois que c'est ce que fait l'implémentation de msvc par exemple).

    MAT.

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Salut.
    Je vais citer un livre.

    3 points sont requis pour qu'une classe soit gérée par un conteneur standard :

    Citation Envoyé par The C++ Standard Library : A Tutorial and Reference
    • An element must be copyable by a copy constructor. The generated copy should be equivalent to the source. This means that any test for equality returns that both are equal and that both source and copy behave the same.
      All containers create internal copies of their elements and return temporary copies of them, so the copy constructor is called very often. Thus, the copy constructor should perform well (this is not a requirement, but a hint to get better performance). If copying objects takes too much time you can avoid copying objects by using the containers with reference semantics.
    • An element must be assignable by the assignment operator. Containers and algorithms use assignment operators to overwrite old elements with new elements.
    • An element must be destroyable by a destructor. Containers destroy their internal copies of elements when these elements are removed from the container. Thus, the destructor must not be private. Also, as usual in C++, a destructor must not throw; otherwise, all bets are off.
    Egalement, 3 autres points sont demandés selon les fonctionnalités utilisées:

    Citation Envoyé par The C++ Standard Library : A Tutorial and Reference
    • For some member functions of sequence containers, the default constructor must be available. For example, it is possible to create a nonempty container or increase the number of elements with no hint of the values those new elements should have. These elements are created without any arguments by calling the default constructor of their type.
    • For several operations, the test of equality with operator == must be defined. It is especially needed when elements are searched.
    • For associative containers the operations of the sorting criterion must be provided by the elements. By default, this is the operator <, which is called by the less<> function object.
    Selon le compilateur que tu utilises, ces trois derniers points pourront t'être demandés sans que tu ais besoin des fonctionnalités, à tord...

    En espérant que tu y voies plus clair.

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Merci c'est super précis et c'est exactement ce que je cherchais.

Discussions similaires

  1. Problème entre boost::array std::copy et les vector
    Par Davidbrcz dans le forum Boost
    Réponses: 4
    Dernier message: 27/03/2008, 19h20
  2. [Vector] Copie des éléments lors d'un push_back() ?
    Par 5kippy dans le forum SL & STL
    Réponses: 4
    Dernier message: 22/11/2007, 11h11
  3. copie de <vector>
    Par dev0077 dans le forum C++
    Réponses: 1
    Dernier message: 05/10/2007, 22h19
  4. Copie de 2 vectors STL
    Par cjacquel dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/12/2006, 21h20
  5. copie vector
    Par Vips dans le forum SL & STL
    Réponses: 11
    Dernier message: 25/03/2006, 11h52

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