2013-06-20 96 views
1

我想編寫一個有效的執行下面的複合物類:C++的std ::向量構造

class composite{ 
    vector<base_class *> Vec; 
    //Other useful constants 
public: 
    composite(vector<base_class*>); 
    //Other useful operations... 
}; 

我的問題是關於類的構造函數和實例,尤其是對象VEC。在那一刻,我使用下面概述的相當粗糙的實現。我的實現是記憶效率。我幾乎是一個C++的新手,所以我不知道我在這裏有最佳的解決方案...

我使用多態性來存儲不同派生類的向量,例如,

vector<base_class *> Vec1; 
Vec1.reserve(2); 
class1 * C1 = new class1(....); 
Vec1.push_back(C1); 
class2 * C2 = new class(....); 
Vec1.push_back(C2); 

其中class1和class2是派生的base_class類。然後我通過VEC 1到複合材料的構造如下:

composite::composite(vector<base_class*> Vec1){ 
    Vec.reserve(Vec1.size()); 
    Vec.swap(Vec1); 
    //etc... 
} 

我的感覺是,這是在內存相當有效,因爲VEC 1將是(它的元素都被交換到VEC)施工後空。另一方面,這似乎很浪費,因爲我基本上是將Vec1複製到Vec中。有沒有更好的方法來做到這一點?我可以以某種方式將矢量Vec1嵌入到複合材料中嗎?提前致謝!

+3

原始指針的'std :: vector'是一個完全錯誤的想法。您想要使用唯一或共享指針的向量,具體取決於這些對象擁有的所有權。 – Griwes

+0

也可以在構造函數中使用&,或&&作爲向量,並將其明確。 – doctorlove

回答

3

首先,使用適當的智能指針代替原始指針。

接下來 - 在您使用的方法中,reserve()調用是完全不必要的 - swap()只是交換內部指針。

而在去年 - 因爲我們是在2013年,C++ 11已經被使用,所以構造函數應該是這樣的:

composite::composite(std::vector<std::unique_ptr<base_class>> v) 
    : vec{ std::move(v) } 
{ 
} 

爲什麼這樣?以參數取值已將其複製,並且由於您不再使用該副本,因此可以安全地將其移出,從而實現最少量的副本來初始化成員。

+0

如果它不是r值參考,你可以移動v嗎? – doctorlove

+1

@doctorlove,顯然,否則移動語義將完全無用......讓我稍微改進一下答案。 – Griwes

+0

爲什麼將副本放入參數中比提供直接移動方法更好? (並感謝更早糾正我的廢話) – doctorlove

1

如果您確實在意是否製作任何矢量的副本,則應首先通過引用傳遞構造函數參數。因此,「常規」實施將如下所示:

composite::composite(const vector<base_class*>& Vec1) 
    : Vec(Vec1) 
{ 
} 

這將省略一個副本。除非你有跡象表明這會導致任何問題,否則我不會爲此煩惱。你之前已經做過三次動態內存分配,爲什麼你會關心第四個?