在课堂上,我有一个来自不同类的对象向量,如下所示:
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有我想要的私有值吗?
答案 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_back
或emplace_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);