【问题标题】:initialise a deque of vector pointers初始化向量指针的双端队列
【发布时间】:2010-12-10 13:58:07
【问题描述】:
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 的想法)可以用来解决这类问题。

【问题讨论】:

  • 不要得到你想做的事。发布您已经拥有的“慢”代码怎么样。
  • w817,您是否有 1 个包含 500 个条目的向量和一个包含 1 个条目的双端队列,其中有一个指向您的向量的指针,或者您是否有一个指向向量的双端队列和 1 个额外的向量?基本上你想要一种有效的方式来复制 MDataContainer?
  • 编译器生成的拷贝构造函数有什么问题?在您提供的示例代码中,编译器将生成一个复制构造函数和复制赋值运算符(如果您自己没有定义它们),它们应该为您做正确的事情。
  • @它的指向向量的双端队列(不是双端队列中的单个向量)。
  • @Bowie Owens 它包含太多的指针,浅拷贝不起作用。

标签: c++ stl vector deque


【解决方案1】:

如果您想要深拷贝,您可能需要重新考虑您的设计。如果你有一个包含 10 个(任意选择的数字)共享指针的双端队列,这些指针指向 500 个 MD 对象的共享指针的向量,那么复制构造函数将需要从堆中分配 5021 次,最小值,这将是庞大的。您确定需要指向向量和 MD 对象的智能指针吗?如果没有,分配数量可以减少到 11 与 std::deque&lt;std::vector&lt;MD&gt;&gt; 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
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多