Push_back来自聚合类的对象向量

时间:2013-05-23 08:38:38

标签: c++ vector struct aggregate push-back

我对矢量有点问题。据我所知,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;
    }
}

2 个答案:

答案 0 :(得分:1)

您已将矢量调整为 len 的大小。

使用默认构造函数在向量中创建 len 对象。

所以当你pushback()另一个对象时, len + 1

单元格0中的对象实际上是默认构造对象之一。

我认为你想要做的只是使用 reserve() 来为对象留出足够的空间。


vector::resize()

  

如果n大于当前容器大小,则内容为   通过在最后插入尽可能多的元素来扩展到达   大小如果指定了val,则将新元素初始化为   val的副本,否则,它们是值初始化的。

vector::reserve()

  

如果n大于当前矢量容量,则该函数会导致   重新分配其存储容器增加其容量为n   (或更高)。

答案 1 :(得分:0)

您正在将矢量调整为len空元素

然后您在位置push_back

添加新项目(通过len

然后在位置0处打印项目,这是您原始的空元素之一

你的意思是reserve而不是resize

(注意:reserve()通常推荐。只需将您的向量留空,push_back()您需要的新元素。此外,如果你需要获取最后一个元素,只需使用v.back()而不是假设的索引以便于使用。