[英]C++ std::vector in constructor
我正在嘗試編寫以下復合類的有效實現:
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的派生類。 然后我將Vec1傳遞給復合的構造函數,如下所示:
composite::composite(vector<base_class*> Vec1){
Vec.reserve(Vec1.size());
Vec.swap(Vec1);
//etc...
}
我的感覺是,這在內存上是非常有效的,因為Vec1在構造之后將是空的(它的元素已被交換到Vec中)。 另一方面,它似乎非常浪費,因為我基本上將Vec1復制到Vec中。 我有更好的方法嗎? 我可以以某種方式將矢量Vec1嵌入到復合材料中嗎? 提前致謝!
首先,使用適當的智能指針代替原始指針。
接下來 - 在你使用的方法中, reserve()
調用是完全沒必要的 - swap()
只是交換內部指針。
最后 - 自從我們在2013年,C ++ 11已經被使用,所以構造函數應該如下所示:
composite::composite(std::vector<std::unique_ptr<base_class>> v)
: vec{ std::move(v) }
{
}
為什么這樣? 按值獲取參數已經復制了它,並且由於您不再使用該副本,因此可以安全地將其移出,從而實現初始化成員的最少量副本。
如果您真的關心是否會創建任何向量的副本,則應首先通過引用傳遞構造函數參數。 所以“通常”的實現看起來像這樣:
composite::composite( const vector<base_class*>& Vec1 )
: Vec( Vec1 )
{
}
這將省略一份副本。 在你有跡象表明這會導致任何問題之前,我不會為此煩惱。 你以前做過三次動態內存分配,你為什么要關心第四種呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.