构造函数中的C ++ std :: vector

时间:2013-06-20 09:58:06

标签: c++ vector constructor polymorphism 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的派生类。然后我将Vec1传递给复合的构造函数,如下所示:

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

我的感觉是,这在内存上非常有效,因为Vec1在构造之后将是空的(它的元素已被交换到Vec中)。另一方面,它似乎非常浪费,因为我基本上将Vec1复制到Vec中。我有更好的方法吗?我可以以某种方式将矢量Vec1嵌入到复合材料中吗?提前谢谢!

2 个答案:

答案 0 :(得分:3)

首先,使用适当的智能指针代替原始指针。

下一步 - 在您使用的方法中,reserve()调用完全没必要 - swap()只是交换内部指针。

最后 - 自从我们在2013年,C ++ 11已经被使用,所以构造函数应该是这样的:

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

为什么这样?按值获取参数已将其复制,并且由于您不再使用该副本,因此可以安全地将其移出,从而实现初始化成员所需的最少量副本。

答案 1 :(得分:1)

如果您真的关心是否会创建任何向量的副本,则应首先通过引用传递构造函数参数。所以“通常”的实现看起来像这样:

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

这将省略一份副本。在你有迹象表明这会导致任何问题之前,我不会为此烦恼。您之前已经进行了三次动态内存分配,为什么还要关注第四种?