2010-12-10 59 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; 
}; 

我的要求是在一個向量中存儲500個MD類型的對象,然後我在這個向量中保存這些向量的指針。這裏的問題是如何在複製構造器MDataContainer(常量MDataContainer & mDataCont)中初始化此列表並將其分配給重載賦值運算符MDataContainer & operator =(const MDataContainer & mDataCont)。爲了擺脫代碼重複,我使用了Init函數。請給我解釋一下可以提高性能的方法。我已經在使用一些粗糙的方法。我們可以使用一些算法或其他庫(提升我沒有gr8的想法),它可以用來解決這類問題。初始化一個向量指針的列表

+0

不要真正得到你想要做的事情。如何發佈您已有的「慢」代碼。 – ronag 2010-12-10 14:20:39

+0

w817,你有1個向量有500個條目和一個有1個入口的入口,其中有一個指向你的向量的指針,或者你有一個向量指針和一個額外的向量指針?基本上你想要一個有效的方法來複制MDataContainer? – stefaanv 2010-12-10 14:32:33

+0

編譯器生成的拷貝構造函數有什麼問題?在示例代碼中,編譯器將生成一個拷貝構造函數和複製賦值運算符(如果您自己沒有定義它們),它應該爲您做正確的事情。 – 2010-12-11 10:54:07

回答

0

如果您想要深度複製,您可能需要重新考慮您的設計。如果有一個包含10個(任意選取的數字)共享指針的deque,該指針指向500個MD對象的共享指針的向量,則複製​​構造函數將需要5021個來自堆的分配,最小值將是龐大的。你確定你需要智能指針指向矢量和MD對象嗎?如果沒有,分配的數量可以降低到11與std::deque<std::vector<MD>> mDataQueContr;

如果你想深層副本與智能指針,你必須循環構造它們,因爲複製構造一個shared_ptr將是一個淺複製。我還沒有看過shared_ptr,但假設它們像auto_ptr一樣工作,你需要這樣的東西。我使用迭代器,因爲它們比在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 
    }