2

コースへのポインタを含むベクトルのベクトルを初期化したかったのです。私はこれを宣言しました:

std::vector<std::vector<Course*> > *CSPlan = 
        new std::vector<std::vector<Course*> >(smsNum);

これによって私がやりたかったのは、ベクトルのベクトルを作成することです。各内部ベクトルは、コースへのポインターを含むベクトルであり、MAINベクトルのサイズを大きくしたかったのですint smsNum。さらに、ヒープ上にそれが欲しかった。

私の質問は次のとおりです。

  1. メインベクトルと内部ベクトルの両方がヒープに割り当てられていますか?または、メインベクトルのみがヒープ上にあり、そのインデックスはスタック上の他の小さなベクトルへのポインタですか?

  2. サイズが大きいと宣言したint smsNumので、メインベクトルのサイズは10ですが、小さいベクトルはどうでしょうか。それらもそのサイズですか、それともまだ動的ですか?

最終的に私の目標は、ヒープ上にメインベクトルと子ベクトルの両方のベクトルのベクトルを配置することです。メインベクトルのみがサイズsmsNumであり、残りは動的です。

4

1 に答える 1

4

ユーザーが望むだけ大きくなる可能性のある構造は、ヒープに割り当てられます。一方、メモリスタックは、静的に割り当てられた変数を割り当てるために使用されます。この変数は、コンパイルプロセス中に、プログラムが静的にサイズを制御します。

あなたはこのようなループを持つことができるので:

for (i = 0; i < your_value; i++) {
    vector.insert(...);
}

また、標準入力から読み取られた整数と見なすyour_valueと、コンパイラはベクトルの大きさを制御できません。つまり、実行できる挿入の最大量がわかりません。

これを解決するには、構造体をヒープに割り当てる必要があります。ヒープでは、プライマリメモリとスワップを考慮して、OSが許可する範囲で構造体が大きくなる可能性があります。補足として、ベクトルへのポインターを使用する場合は、ベクトルを参照するために変数を動的に割り当てるだけです。これは、ベクトルの内容が必ずしもヒープに割り当てられているという事実を変更するものではありません。

スタックには次のものがあります。

  • 変数「y」のアドレスを格納する変数「x」。

そして、あなたのヒープ内:

  • 変数「y」の値。これは、ベクトルのベクトルへの参照です。

  • ベクトルのベクトルの内容(「y」によってアクセスされ、「x」によってアクセスされます)。

于 2012-11-18T12:16:04.200 に答える