инициализировать деку векторных указателей - PullRequest
0 голосов
/ 10 декабря 2010
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 в векторе, тогда я сохраняю указатель на эти векторы в deque. Проблема здесь заключается в том, как инициализировать этот список в конструкторе копирования MDataContainer (const MDataContainer & mDataCont) и назначить его в перегруженном операторе назначения MDataContainer & operator = (const MDataContainer & mDataCont). Чтобы избавиться от дублирования кода, я использую функцию Init. Пожалуйста, объясните мне метод, который может дать лучшую производительность. Какой-то грубый способ я уже использую. Можем ли мы иметь какой-нибудь алгоритм или какую-то другую библиотеку (надеюсь, у меня нет идеи gr8), которую можно использовать для решения этой проблемы.

1 Ответ

0 голосов
/ 20 июля 2011

Вы можете пересмотреть свой дизайн, если вам нужна глубокая копия.Если у вас есть очередь, содержащая 10 (произвольно выбранное число) общих указателей на векторы из 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
    }
...