2010-12-10 9 views
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オブジェクトをベクトルに格納し、これらのベクトルへのポインタを両端キューに保持しています。ここでの問題は、コピーコンストラクタMDataContainer(constのMDataContainer & mDataCont)にこのリストを初期化し、オーバーロード代入演算子MDataContainer &演算子=(constのMDataContainer & mDataCont)でそれを割り当てる方法です。コードの重複を取り除くために、Init関数を使用しています。 Plsは私により良いパフォーマンスを与える方法を説明します。私はすでに使用しているいくつかの荒い方法。この種の問題を解決するために使用できるいくつかのアルゴまたはその他のライブラリ(私はgr8のアイデアを持っていない)を持てますか?ベクトルポインタの両端キューを初期化する

+0

あなたがしたいことを得ることはできません。あなたがすでに持っている "遅い"コードを投稿するのはどうですか? – ronag

+0

w817、1つのベクトルに500のエントリがあり、1つのエントリの両端キューにベクトルへのポインタがありますか、またはベクトルへのポインタと1つの余分なベクトルがありますか?そして、基本的にMDataContainerを効率的にコピーしたいのですか? – stefaanv

+0

コンパイラが生成したコピーコンストラクタで何が問題になっていますか?コード例では、コンパイラはコピーコンストラクタとコピー代入演算子を生成します(自分で定義していない場合)。これは適切な処理を行います。 –

答えて

0

あなたは深いコピーをしたい場合は、あなたのデザインを再考することをお勧めします。あなたはMDオブジェクトの500の共有ポインタのベクトルに10(任意に選んだ番号)共有ポインタを含む両端キューを持っている場合は、コピーコンストラクタは、かさばることになるだろうヒープ、最小から5021の割り当てを必要とする予定です。ベクトルとMDオブジェクトへのスマートポインタが必要ですか?そうでない場合は、割り当ての数を11に減らすことができますstd::deque<std::vector<MD>> 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 
    } 
関連する問題