我对矢量有点问题。据我所知,push_back()
将复制参数并将副本插入向量中。
struct BridgeData
{
string name;
string type;
};
对于像我这样的简单聚合类,应该通过复制两个字段来创建对象的副本。
for ( int i = 0; i<len; i++)
{
BridgeData data = {grp.get(1+i).asString().c_str()};
v.push_back(data);
cout << v[i].name << endl;
}
vector<BridgeData> &v
。
当我打印data.name
时,我得到了我在支撑列表中使用的值但是当我打印v[i].name
时,该字段看起来是空的...是这样的默认副本“构造函数”聚合类默认初始化所有字段?
修改
如果这还不够,可以使用更多代码。我有一个包含数据成员vector<BridgeData> yarpGroups
的类。然后我将它作为同一类方法体中的引用传递:readBridgeDataVector(bGeneral,"yarpgroups",yarpGroups,numberOfYarpGroups);
。
请忽略其他论点,因为它们无关紧要(我确信)。
早期剪辑来自此功能:
void readBridgeDataVector(Bottle &rf, string name, vector<BridgeData> &v, int len)
{
v.resize(len);
if(rf.check(name.c_str()))
{
Bottle &grp = rf.findGroup(name.c_str());
for ( int i = 0; i<len; i++)
{
BridgeData data = {grp.get(1+i).asString().c_str(),"float"};
v.push_back(data);
cout << v[0].name << endl;
}
}
else
{
cout << "Could not find parameters for " << name << ". "
<< "Setting everything to null by default" << endl;
}
}
答案 0 :(得分:1)
您已将矢量调整为 len 的大小。
使用默认构造函数在向量中创建 len 对象。
所以当你pushback()
另一个对象时, len + 1 。
单元格0中的对象实际上是默认构造对象之一。
我认为你想要做的只是使用 reserve() 来为对象留出足够的空间。
如果n大于当前容器大小,则内容为 通过在最后插入尽可能多的元素来扩展到达 大小如果指定了val,则将新元素初始化为 val的副本,否则,它们是值初始化的。
如果n大于当前矢量容量,则该函数会导致 重新分配其存储容器增加其容量为n (或更高)。
答案 1 :(得分:0)
您正在将矢量调整为len
空元素
然后您在位置push_back
len
)
然后在位置0
处打印项目,这是您原始的空元素之一
你的意思是reserve
而不是resize
?
(注意:reserve()
通常不推荐。只需将您的向量留空,push_back()
您需要的新元素。此外,如果你需要获取最后一个元素,只需使用v.back()而不是假设的索引以便于使用。