簡體   English   中英

初始化向量指針的雙端隊列

[英]initialise a deque of vector pointers

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(const MDataContainer&mDataCont)中初始化此列表,並在重載的賦值運算符MDataContainer&operator =(const MDataContainer&mDataCont)中進行分配。 為了擺脫代碼重復,我使用了Init函數。 請向我解釋一種可以提供更好性能的方法。 我已經在使用一些粗略的方法。 我們可以有一些算法或其他一些庫(我沒有gr8的想法)可以用來解決這種問題。

如果需要深層復制,則可能需要重新考慮設計。 如果您的雙端隊列包含指向MD對象的500個共享指針的向量的10個(任意選擇的數量)共享指針,則復制構造函數將需要從堆中分配5021個最小分配,這將是龐大的。 您確定需要智能指針來指向矢量和MD對象嗎? 如果不是,則可以使用std::deque<std::vector<MD>> mDataQueContr;將分配數減少到11 std::deque<std::vector<MD>> mDataQueContr;

如果您確實想要帶有智能指針的深層副本,則必須循環遍歷以構造它們,因為構造shared_ptr的副本將是淺層副本。 我還沒有研究shared_ptr,但是假設它們像auto_ptr一樣工作,那么您需要這樣的東西。 我使用迭代器,因為它們比在雙端隊列上建立索引要快。

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
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM