【问题标题】:Push_back in vector of objects from aggregate class来自聚合类的对象向量中的 Push_back
【发布时间】:2013-05-18 12:53:59
【问题描述】:

我在使用矢量时遇到了一点问题。据我了解,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&lt;BridgeData&gt; &amp;v.

当我打印data.name 时,我得到了我在花括号列表中使用的值,但是当我打印v[i].name 时,该字段似乎为空...此类聚合类的默认副本“构造函数”是否默认初始化所有字段?

编辑:

如果这还不够,这里还有更多代码。我有一个包含数据成员vector&lt;BridgeData&gt; 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;
    }
}

【问题讨论】:

  • 我看到你有对向量的引用。也许索引与您的 push_back 调用不匹配? (输入时不是空的?)
  • 不,我很确定您正在尝试做的事情应该有效。您将不得不发布更多代码/最少的复制。
  • 您在构造矢量时是否提供了尺寸?
  • 确实,向量是从另一个函数传递过来的。这个片段来自一个函数,其目标是 push_back 元素。
  • 如果向量中已有数据,您的新项目将位于位置 N 但您将打印出位置 0 的值 - 这是您的问题吗?尝试打印出 v.back().name。

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


【解决方案1】:

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

然后您将在位置len 添加一个新项目(通过push_back

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

您的意思是reserve 而不是resize

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

【讨论】:

  • 这正是问题所在,现已解决。非常感谢,我认为通过不向resize 提供辅助参数,它会产生reserve 的效果(虽然我不知道那个函数)。
【解决方案2】:

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

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

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

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

我认为您想要做的是使用 reserve() 只是为了有足够的空间来放置对象。


vector::resize()

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

vector::reserve()

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2015-09-07
    • 2014-09-13
    • 2015-07-12
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多