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