繁体   English   中英

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

[英]Using non-default constructor when adding a new element in a vector of <class> objects

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

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类的对象,该对象在矢量barObject的位置i处具有我想要的私有值?

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

为了使用插入,您需要对插入的位置进行迭代:

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[]则没有。

回答您的问题。 是的,您可以执行以下插入操作:

barObject.insert(i, tempBar);

只要确保迭代器i是有效的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM