C++ 在聚合类的对象向量中推回

C++ 在聚合类的对象向量中推回,c++,vector,struct,aggregate,push-back,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

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

您已将向量调整为大小len

这将使用向量中的len对象的默认构造函数来装箱

因此,当您
pushback()
另一个对象时,它就位于len+1的位置

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

我认为您想要做的是使用来为对象留出足够的空间


如果n大于当前容器大小,则内容为 通过在末尾插入尽可能多的元素来扩展,以达到 n的大小。如果指定了val,则新元素将初始化为 val的副本,否则,将对其进行值初始化

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


您正在将向量大小调整为
len
空元素

然后在位置
len

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

您的意思是保留而不是调整大小吗


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

我发现您有对向量的引用。也许索引与您的回拨呼叫不匹配?(输入时不是空的?)不,我很确定你想做的应该是有效的。你必须发布更多的代码/一个最小的复制。你在构建向量时提供了向量的大小吗?事实上,向量是从另一个函数传递的。这是从一个函数中截取的,该函数的目标是
向后推
元素。如果向量中已有数据,则新项目将位于位置N,但您将在位置0打印出值-这是您的问题吗?尝试打印出v.back().name。这正是问题所在,现已修复。非常感谢,我认为如果不为
resize
提供辅助参数,它将具有
reserve
的效果(尽管我不知道该函数)。
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;
    }
}