0

C++ベクトル-同じアドレスを指すその一部

こんにちは、私の主題は混乱するかもしれません。

ここに行きます。

ベクトルを取得しました

struct node{
int nodeid;
vector<string> data;
vector<fTable> fdata;
}

struct fTable{
int index;
int key;
}

vector<node> myNode;

いくつかの機能のように...

void chord::someFunc(int nodeid)
{
    node myTempNode;
    vector<string> data1;
    vector<fTable> fdata1;

    myTempNode.nodeid = nodeid
    myTempNode.data = data1;
    myTempNode.fTable = ftable1;

myNode.push_back(myTempNode);
myTempNode.clear();
}

10000個のオブジェクトを作成しますが、この時点では、nodeidの値しか取得していません。

しかし、データとfTableについては、空の文字列ベクトルと空のfTableベクトルに設定していますが、10000個のオブジェクトを作成して同じことを行うのではないかと思います。

10000個の空の文字列とfTableベクトルを作成していますか

このすべてのオブジェクトポイントを同じ文字列ベクトル(null値)とfTableベクトル(空の値)に設定して、いくつかのメモリを保存できるようにする方法はありますか?私が10000ノードかそこらを作成するか、作成するかもしれないことを考えると。そしてメモリ消費は私にとって懸念事項です。

すべての助けをありがとう。

4

3 に答える 3

1

いいえ、ベクターは空であるため、多くのスペースを消費せず、文字列や fTable オブジェクトは作成されません。

あなたの限られたC ++の知識を与えてください。私はポインターを避け、値に固執します。

次の(すぐに)次のことを行う必要はありません。ノードのコンストラクターがそれを処理します。これは、空のベクトルを空のベクトルで上書きするだけです。

node myTempNode;
vector<string> data1;
vector<fTable> fdata1;

myTempNode.data = data1;
myTempNode.fTable = ftable1;

ノードに次のようなコンストラクターを指定すると:

struct node{
    int node(int id) : nodeid(id) {}
    int nodeid;
    vector<string> data;
    vector<fTable> fdata;
}

次に、次のように書くだけです。

myNode.push_back( node(nodeid) );
于 2013-02-17T10:34:23.717 に答える
0

ベクトルを作成しても常にデータが作成されるとは限りません。ベクトルのデータは必要に応じて割り当てられるため、データのないベクトルはsizeof(std:vector<...>)(予約サイズが 0 の場合) バイトを使用する可能性が高く、データを含むベクトルは実際には を使用しますsizeof(vector<...>) + n * sizeof(data)。ここで nベクトル内の予約項目の数です。私の実装では、ベクトルのサイズは 28 バイトです。

1 番目の方法: ベクトルをフィールドとして。ベクトル フィールドを使用する利点は、それらが動的に割り当てられないことです。これにより、一連のnew/delete手動呼び出しが不要になり、より安全になります。

2番目の方法:あなたが言ったようにポインターを使用することもできます:

struct node
{
    int nodeid;
    vector<string>* data; // pointer
    vector<fTable>* fdata; // pointer
};

それらを 0 (ヌル) に設定すると、ベクトルのサイズからポインターのサイズを引いた値をノードごとに保存できます。ベクトルを持つノードが必要な場合は、単純newにベクトルを指定し、適切なポインターを設定します。ただし、このメソッドは、ポインターのサイズも使用するため、最終的には前のメソッドよりも多くのスペースを必要とします。また、削除を管理する必要があります (ノード デストラクタで実行できますが、ノードを破棄する前にベクトルの割り当てを解除するよりも効率が悪い場合があります)。

結論: データが占める合計サイズ (例: 10000 * ...) を見積もり、特定のモデルを使用する必要があるかどうかを確認することをお勧めします (つまり、最初に測定します)。個人的には、最初のものを使用することをお勧めします (ポインターはありません)。

また、コードを改善するために、ノードにコンストラクター (または 2 つ) を使用することをお勧めします。

于 2013-02-17T10:37:36.383 に答える
0

はい、ポインターのベクトルを使用します。つまり、

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}

ただし、メモリ管理に注意してください。ノードが削除されても、data と fdata が指す文字列と fTable は削除されません。割り当てられたノードがこれらのデータを所有する必要がある場合は、デストラクタを追加します。

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    ~node() {
        for (auto i = data.begin(); i != data.end(); ++i)
            delete *i;
        for (auto i = fdata.begin(); i != fdata.end(); ++i)
            delete *i;
    }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}
于 2013-02-17T10:33:52.683 に答える