1

以下の配列を含む C++ 構造体を作成できます。

struct foo{
    int bar[42];
};

私がやりたいことは次のとおりです。

struct foo{
    std::vector<int> bar(42);
};

もちろん、これはコンパイルされませんが、意図はわかります。.reserve() などは承知しておりますが、 .reserve() を宣言する際に既にスペースを確保しておきたいfooです。

その理由は、構造体内の配列を使用して C コードを生成するかなり複雑な Perl スクリプトを変更することになっているためです。これらの配列は s に置き換える必要がありますstd::vectorpush_backその後、スクリプトは XML ファイルに応じて配列を初期化しますが、構造が深くネストされているため (配列の構造体と構造体の配列)、スクリプトをいじりたくありません。もちろん、配列のサイズは異なります。

ご提案いただきありがとうございます。

4

5 に答える 5

6

コンストラクターを使用します。

struct foo{
    std::vector<int> bar;
    foo() : bar(32) {}
};

インスタンスの作成時に、ベクターのメモリが自動的に割り当てられます。初期化リストは、コンストラクター本体が実行される前にメンバーを初期化します。

于 2013-01-18T10:18:17.393 に答える
3

コンストラクターを追加し、初期化リストを使用します。

struct foo {
    foo() : bar(42) {}
    std::vector<int> bar;
};

コンパイラが C++11 機能をサポートしている場合は、std::array<>代わりに使用してください。

struct foo {
    std::array<int, 42> bar;
};

またはboost::array<>、C++11 が利用できず、ブーストが許可されている場合。

于 2013-01-18T10:18:24.347 に答える
2

既存の回答は、やりたいことを行う方法を説明していますが、理由を説明する重要な部分を見逃していると思います。理解しておく必要があるのはstruct、C++ では は単純にほぼ同義語でclassあり、唯一の違いは、構造体が既定でパブリック メンバーを持つようになり、クラスが既定でプライベートになることです。classコード内のすべてのインスタンスを次のように置き換えることができます

struct X
{
    private:
    ...
}

と置き換えるとまったく同じように機能し、その逆も同様です。これは、クラスで必要なことを行うためにコンストラクターを使用するのと同じように、構造体でコンストラクターを使用することを意味します。structsclass

struct foo
{
    std::vector<int> bar;
    foo() : bar(42) {}
}

ところで、このコンストラクタstd::vector、さらにいくつかの引数を取り、2 番目の引数はベクトルを埋めるfoo() : bar(42, -1) {}値であるため、ベクトルを の値で埋めることができます-1

于 2013-01-18T10:48:33.503 に答える
0

他の回答で提案されているように、コンストラクターを使用してください。しかし、私はあなたを直さなければなりません:

  1. スペースは、定義後に「すでに割り当てられています」(コンストラクターを使用する場合)。
  2. .reserve() は絶対に使用しないでください。.resize() のみを使用してください (違いを理解する前に)。
  3. 宣言後に .resize() を安全に呼び出すことができ、(コンストラクターを使用する代わりに) ほとんどオーバーヘッドなしで呼び出すことができます。とにかく、コンストラクターを学び、使用します。
于 2013-01-18T10:27:34.340 に答える
0

構造体のコンストラクター (できれば初期化リスト)で、ベクトル (つまり、 callstd::vectorのコンストラクター) のサイズを設定する必要があります。

そのようです:

struct foo{
    foo() : bar(42) {}
    std::vector<int> bar;
};
于 2013-01-18T10:18:08.310 に答える