0

問題が述べたように、これは実行可能です:

#include <iostream>

int main(int argc, char *argv[])
{
    unsigned short int i;
    std::cin >> i;
    unsigned long long int k[i][i];
}

ここでは、i x i のサイズの配列を宣言しました。両方の次元は変数です。

しかし、これではありません:

#include <iostream>

int main(int argc, char *argv[])
{
    unsigned short int i;
    std::cin >> i;
    unsigned long long int** k = new int[i][i];
    delete[] k;
}

私はそれを伝えるコンパイラメッセージを受け取りました

エラー: 割り当てられた配列の最初の次元のみが動的サイズを持つことができます

私はこれを行うことを余儀なくされています:

#include <iostream>

int main(int argc, char *argv[])
{
    unsigned short int i;
    std::cin >> i;
    unsigned long long int** k = new unsigned long long int*[i];
    for ( unsigned short int idx = 0 ; idx < i ; ++ i )
        k[idx] = new unsigned long long int[i];
    for ( unsigned short int idx = 0 ; idx < i ; ++ i )
        delete[] k[idx];
    delete[] k;
}

私の理解では、 new と delete は、スタックではなくヒープに何かを割り当てるために使用されます。これは、スコープ外になったときに削除されず、関数やオブジェクト間でデータを渡すのに役立ちます。

私が理解していないkのは、最初の例で宣言したときに何が起こるかということnewです。deleteまたはvectors。

私が得ていないこれらの2つのソリューションには、長所と短所がありますか、それともそれが何であるかだけですか?

ところで、Apple の LLVM コンパイラを使用しています。

4

3 に答える 3

0

2D 配列機能の実装を簡単に見つけることができると確信していますが、独自のクラスを作成することもできます。最も簡単な方法はstd::vector、データを保持し、2 つの座標を取得して単一のインデックスをベクトルに返すインデックス マッピング関数を使用することです。

クライアント コードは arr.at(x,y) の代わりに少し異なって見えますarr[x][y]が、それ以外は同じです。によって行われるようにメモリ管理をいじる必要はありません。コンストラクタまたはディメンション設定関数でstd::vector使用するだけです。v.resize(N*N)

于 2013-06-01T14:43:47.520 に答える