2010-12-10 21 views
0
class MD { 
    MD(); 
    MD(const MD &obj); 
    MD& operator=(const MD &obj); 
    private: 
    int Name; 
    double sal; 
}; 

typedef std::shared_ptr<MD> mDataPtr; 
typedef std::vector<mDataPtr> mDataVecContr; 
typedef std::shared_ptr<mDataVecContr> ptrMdataVecContr; 

class MDataContainer{ 
    public: 
    MDataContainer(); 
    MDataContainer(const MDataContainer &mDataCont); 
    MDataContainer& operator=(const MDataContainer &mDataCont); 

    private: 
    mDataVecContr vecNode; 
    std::deque<ptrMdataVectContr> mDataQueContr; 
}; 

Mon exigence est de stocker 500 objet de type MD dans un vecteur puis je garde un pointeur vers ces vecteurs dans deque. Le problème ici est de savoir comment initialiser cette liste dans le constructeur de copie MDataContainer (const MDataContainer & mDataCont) et l'affecter dans l'opérateur d'affectation surchargé MDataContainer & operator = (const MDataContainer & mDataCont). Pour se débarrasser de la duplication de code, j'utilise la fonction Init. SVP expliquez-moi une méthode qui peut donner de meilleures performances. Un peu rugueux que je suis déjà en train d'utiliser. Pouvons-nous avoir un algo ou une autre bibliothèque (boost je n'ai pas idée gr8) qui peut être utilisé pour résoudre ce genre de problème.initialise une deque de pointeurs vectoriels

+0

N'obtenez pas ce que vous voulez faire. Que diriez-vous de poster le code "lent" que vous avez déjà. – ronag

+0

w817, avez-vous 1 vecteur avec 500 entrées et une deque avec 1 entrée dans laquelle il y a un pointeur sur votre vecteur ou avez-vous une deque de pointeurs vers des vecteurs et 1 vecteur supplémentaire sur le côté? Et fondamentalement, vous voulez un moyen efficace de copier MDataContainer? – stefaanv

+0

Quel est le problème avec le constructeur de copie généré par le compilateur? Dans l'exemple de code que vous avez donné, le compilateur va générer un constructeur de copie et un opérateur d'affectation de copie (si vous ne les définissez pas vous-même) qui devrait faire ce qu'il vous faut. –

Répondre

0

Vous voudrez peut-être reconsidérer votre conception si vous voulez une copie profonde. Si vous avez un deque contenant 10 pointeurs partagés (nombre arbitrairement choisi) à des vecteurs de 500 pointeurs partagés d'objets MD, un constructeur de copie va nécessiter 5021 allocations du tas, minimum, ce qui va être encombrant. Etes-vous sûr que vous avez besoin de pointeurs intelligents pour les vecteurs et les objets MD? Sinon, le nombre d'allocations peut être ramené à 11 avec std::deque<std::vector<MD>> mDataQueContr;

Si vous voulez la copie profonde avec des pointeurs intelligents, vous devrez passer en boucle pour les construire, car la construction d'un shared_ptr sera peu profonde copie. Je n'ai pas encore regardé shared_ptr, mais en supposant qu'ils fonctionnent comme auto_ptr, vous voulez quelque chose comme ça. J'utilise des itérateurs, car ils sont plus rapides que l'indexation sur deque.

MDataContainer::MDataContainer(const MDataContainer &mDataCont) { 
    // initialize the deque to default null shared pointers 
    mDataQueContr.resize(mDataCont.mDataQueContr.size()); 
    // for each super smart pointer 
    std::dequeue<ptrMdataVectContr>::iterator destsup = mDataQueContr.begin(); 
    std::dequeue<ptrMdataVectContr>::const_iterator srcsup; 
    srcsup = mDataCont.mDataQueContr.begin(); 
    for(; destsup != mDataQueContr.end(); ++destsup,++srcsup) { 
     // assign it a new vector of the right size of null shared pointers 
     *destsup = new mDataVecContr((*srcsup)->size()); 
     // for each sub smart pointer 
     mDataVecContr::iterator destsub = (*destsup)->begin(); 
     mDataVecContr::const_iterator srcsub = (*srcsup)->begin(); 
     for(; destsub != (*destsup)->end(); ++destsub,++srcsub) 
      *destsub = new MD(**srcsub); //assign it a new MD copy 
    }