簡體   English   中英

構造函數中的C ++ std :: vector

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM