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&amp; mDataCont)中初始化此列表,并在重载的赋值运算符MDataContainer&amp;中分配它。 operator =(const MDataContainer&amp; mDataCont)。为了摆脱代码重复,我使用的是Init函数。请解释一下可以提供更好性能的方法。我已经在使用的一些粗略方式。我们可以有一些算法或其他一些库(提升我没有gr8的想法)可以用来解决这类问题。
答案 0 :(得分:0)
如果您需要深层复印,可能需要重新考虑您的设计。如果你有一个双端包含10个(任意选择的数字)共享指针到500个MD对象的共享指针的向量,那么复制构造函数将需要5021来自堆的最小分配,这将是笨重的。您确定需要智能指针指向矢量和MD对象吗?如果没有,可以使用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
}