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

を印刷する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;
    }
}
4

2 に答える 2

1

ベクトルのサイズをlenに変更しました。

これにより、デフォルトのコンストラクターを使用してベクター内のlenオブジェクトが作成されます。

したがって、pushback()別のオブジェクトを配置すると、len+1になります。

セル 0 のオブジェクトは、実際にはデフォルトで構築されたオブジェクトの 1 つです。

あなたがやりたかったのは、オブジェクトに十分なスペースを確保するためだけにreserve()を使用することです。


vector::resize()

n が現在のコンテナー サイズより大きい場合、コンテンツは、サイズ n に達するのに必要な数の要素を最後に挿入することによって拡張されます。val が指定されている場合、新しい要素は val のコピーとして初期化されます。それ以外の場合は、値で初期化されます。

vector::reserve()

n が現在のベクトル容量よりも大きい場合、この関数によりコンテナーはストレージを再割り当てし、その容量を n (またはそれ以上) に増やします。

于 2013-05-23T08:50:47.840 に答える
0

ベクターのサイズをlen空の要素に変更しています

次に、位置に(を介してpush_back)新しいアイテムを追加していますlen

0次に、元の空の要素の1つである位置にアイテムを印刷します

するつもりだったreserveのですかresize

(注:ただし、reserve()一般的にはお勧めしません。ベクターを空push_back()のままにし、必要な新しい要素を残してください)。また、最後の要素を取得する必要がある場合は、使いやすいように想定されたインデックスではなく v.back() を使用してください。

于 2013-05-23T08:51:57.433 に答える