0
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;
};

私の要件は、MD 型の 500 個のオブジェクトをベクターに格納することであり、これらのベクターへのポインターを deque に保持しています。ここでの問題は、コピー コンストラクター MDataContainer(const MDataContainer &mDataCont) でこのリストを初期化し、それをオーバーロードされた代入演算子 MDataContainer& operator=(const MDataContainer &mDataCont) に割り当てる方法です。コードの重複をなくすために、Init 関数を使用しています。Plsは、パフォーマンスを向上させる方法を説明してくれます。私がすでに使用している大まかな方法​​。この種の問題を解決するために使用できるアルゴリズムまたは他のライブラリ(ブースト、gr8のアイデアはありません)を使用できますか。

4

1 に答える 1

0

ディープ コピーが必要な場合は、デザインを再検討することをお勧めします。MD オブジェクトの 500 個の共有ポインターのベクトルへの 10 個 (任意に選択された数) の共有ポインターを含む両端キューがある場合、コピー コンストラクターはヒープから少なくとも 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
    }
于 2011-07-19T21:49:28.133 に答える