2

コンパイル時に次元がわからない関数に 2 次元配列を渡そうとするのをあきらめました。いくつかの調査の後、2d ベクトルが適切な代替手段になる可能性があるようです。これが、スペース文字を含むように各セルを初期化して、次元 totalRows X totalColumns の 2d ベクトルを宣言する正しい方法であることを確認したいだけです。

vector<vector<char> > world(totalRows, vector<char>(totalColumns, ' '));
4

2 に答える 2

9

ライン自体は機能し、見た目も問題ありません。しかし、もう少し情報を提供させてください。

標準ライブラリを試して利用することをお勧めします。そうは言っても、頭の中にある 2D 配列のイメージは、メモリ内に線形に存在する必要があることを理解する必要があります。文字の m*n 要素ベクトルを簡単に作成し (この例では)、行優先で (i*n + j) としてインデックスを付けることができます (ゼロベースのカウントのおかげです)。

実際、これが「2 次元」配列の仕組みです。たとえば、要素の通常の配列 -T[][]を実行する場合、それをポインターに減衰しようとすると、単純なT*. 内部では、メモリは連続的かつ直線的に配置されており、形状はなく、1 本の長い通り (コンピューターが認識している) だけです。そして、最初の段落の式 (または同様の式) を使用して、人間が見る行と列の概念を単純に推測します。パソコンは関係ありません。

vectorは、C++ の特徴である方法で配列をカプセル化する標準ライブラリの優れた部分です (単なる肥大化した C ではありません)。その設計そのものにより、内部配列データ構造のサイズ変更が容易になり、C++11 の出現により、ムーブ セマンティクスによりサイズ変更がさらに安価な操作になります。また、ここでは RAII の概念が適用されます。コンストラクターでデータ メンバーを慎重に初期化し、デストラクタでそれらを解放するというアイデアにより、ユーザーとしての動的メモリ割り当ての問題を回避し、必要なときに参照を渡して、スタック上で新しいオブジェクトを単純に伝播することができます。スコープを終了します。

注意すべきことvectorの 1 つは、新しい要素をポップおよびプッシュするために、メモリの内部ブロック (実際の配列のサイズを超える場合がある配列) を作成することです。また、最初にそのサイズを定義する義務はありませんが、push_back、push_front などで簡単に拡張できます。これは、他のものがオンザフライで変更される可能性があり、拡張すると移動セマンティクスを使用してもかなりのコストがかかる可能性があることを意味します.

ベクトルから外れる唯一の理由は、データ指向の重い 3D レンダリングまたはシミュレーションを実行していて、データが非常にカスタムで特定の方法でパックされ、手動でシャッフルされることを期待している場合ですvector。 . しかし、それは裸の配列のより低レベルの領域にあなたを追いやるでしょう (そしてあなたはそれの準備ができているはずです)。ここから得られる重要なことは、「メンタル 2D 配列」ベクトル (実際には、データには実際の幾何学的形状はありません。それが、私たち、ちっぽけな人間がそれを見る方法です) をベクトルとして扱い、それらに別の方法でインデックスを付けることができるということです。すべての行データを順番に 1 つずつ入力してください。非常に単純なレイアウトが得られます。これは (i*n + j) で簡単にプローブ/インデックス付けできます。[i,j] は従来の 2D 行列です。添え字付け/索引付け。

次に、次のように簡単になります。

vector<char> world(totalRows*totalColumns, ' ');

次に、データを適切にプッシュした後、必要な場所に参照渡しし、(i*n + j) としてインデックスを付けます。

コードは機能するはずですが、データを操作したり、移動したり、不要なものを書き込んだりする際に、不必要な肥大化によって不必要な精神的オーバーヘッドが発生する可能性があります。文字の 2D 配列/マトリックスの。必要に応じて、シンタックス シュガーを追加するために機能をオーバーライドすることもできます。

于 2012-06-24T19:33:11.483 に答える
4

あなたのコードは機能します。コメントで気づいたように、vector<vector<T>>真の 2D 配列ではありません。

ここで重要なことは、ベクトルを作成するために使用される規則に常に従う限り、(totalRows, vector<char>(totalColumns, ' '))とは同等であるということです: (または)(totalColumns, vector<char>(totalRows, ' '))line x columncolumn x line

于 2012-06-24T18:46:18.043 に答える