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