在<class>对象的向量中添加新元素时使用非默认构造函数

时间:2017-10-10 21:38:35

标签: c++ stdvector

在课堂上,我有一个来自不同类的对象向量,如下所示:

class Foo {
private:
    std::vector<Bar> barObject;
...
};

类Bar定义了一个默认构造函数(所有私有变量初始化为零),以及一个非默认构造函数,其中可以输入值,如:

Bar newBar(var1, var2);

在类Foo中,声明barObject向量而不指定大小。

我猜测如果我想使用默认构造函数,我可以这样做:

barObject.resize(barObject.size()+1);

然后在向量中更改barObject i的私有变量,如:

barObject.at(i).SetVar(value)

但是如果我想使用非默认构造函数并输入私有变量的值,我是否可以执行以下操作:

barObject.insert(i, tempBar);

tempBar是Bar类的对象,它在vector barObject的位置i有我想要的私有值吗?

2 个答案:

答案 0 :(得分:2)

resize有一个过载:

void resize (size_type n, const value_type& val);

这允许您指定新分配的内存中的值。但是,如果要将矢量分配为构造的一部分,也可以这样做。向量有一个构造函数来执行此操作:

vector (size_type n, const value_type& val,
        const allocator_type& alloc = allocator_type());

然后您只需使用统一初始化语法来构造向量一次:

class Foo {
public:
  Foo() : barObject(17, Bar(4, 5)) {} // Creates a 17 length array
};

如果您只想使用已构建的vector并在其末尾添加元素,则可以使用push_backemplace_back

为了使用insert,你需要在插入位置创建一个迭代器:

auto myIt = barObject.begin() + 3;
myIt = barObject.insert(myIt, 5, Bar(6, 7)); // Inserts 5 objects at offset 3, and increases its size by 5.
myIt += 6;
myIt = barObject.insert(myIt, Bar(8, 7)); // Inserts 1 object at offset 9 (not offset 14), and increases its size by 1.

要更改矢量中的值,您可以使用at()函数或operator[]函数:

barObject.at(3) = Bar(4, 5);
barObject[3] = Bar(4, 5);

两者之间的差异是.at()确定边界检查。而operator[]没有。

答案 1 :(得分:-1)

回答你的问题。是的,你可以做那种插入:

barObject.insert(i, tempBar);

只需确保迭代器i有效:

std::vector<Bar>::iterator i = barObject.begin();
barObject.insert(i, tempBar);