0

我对向量有一点问题。据我了解,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.

当我 print 时data.name,我得到了我在花括号列表中使用的值,但是当我 print 时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;
    }
}
4

2 回答 2

1

您已将向量的大小调整为len

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

因此,当您使用pushback()另一个对象时,它就到位len+1

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

我认为您想要做的是使用reserve()只是为了为对象提供足够的空间。


矢量::调整大小()

如果 n 大于当前容器大小,则通过在末尾插入所需数量的元素来扩展内容,以达到 n 的大小。如果指定了 val,则将新元素初始化为 val 的副本,否则,将它们初始化为值。

矢量::储备()

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

于 2013-05-23T08:50:47.840 回答
0

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

然后,您在位置添加一个新项目(通过push_backlen

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

你的意思是reserve不是resize

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

于 2013-05-23T08:51:57.433 回答