2

格納されている個々の値のみを変更できる、幅と高さが固定された 2 次元配列が必要です。これはヘッダーで宣言され、後でソース ファイルで初期化されます。

私が見つけたので、次のスニペットを試してみました。残念ながら、質問は 1 次元配列または非 const 配列に関するもので、私の状況とは一致しませんでした。

int *const *const a = new int[10][10];
int *const *const b = new int[10][10]();
int *const *const c = new int*[10];
for (int i = 0; i < 10; ++i) {
    c[i] = new int[10];
}

私の希望は最後の例でしたが、初期化されておらず、const であるため初期化できないc場合、「内部」配列をどのように使用できますか?

この配列に別の型は必要ありませんか? 考えてint d[][]いたのですが、幅と高さが一定ではありません。
パラドックスのように思えますが (C++ の世界に存在する場合)、何か不足していますか?

4

2 に答える 2

2

考えてint d[][]いたのですが、幅と高さが一定ではありません。

int d[][]意味がありません (コンパイラによって拒否されます)。多次元配列に関する限り、最初の次元のサイズのみを省略して不完全な型を示すことができます。他の寸法のサイズはタイプの一部です。を省略できないのと同じように、それらを省略できませんint

つまり、 のようなものがある場合int d[5][10]、それは要素型 の 1 次元配列と考えることができますint[10]一般に、多次元配列は 1 次元配列の特殊なケースと考えてください。すべてが理解しやすくなります。


C++ での問題に対する最善の解決策は、内部にプライベート変数std::array<T, Width * Height> data;int widthメンバー変数を含むクラスを作成し、パブリック メンバー関数で個々の x および y 引数から配列オフセットを計算することです。次に例を示します。

T& operator()(int x, int y)
{
    return data[y * width + x];
}

ディメンションが実行時にのみわかっている場合、変更する必要があるのは、std::vector代わりに を使用することだけですstd::array。ストレージは引き続き連続します。

完全な例を次に示します。

#include <vector>
#include <iostream>

class Matrix
{
public:
    Matrix(int width, int height, int value) :
        width(width),
        data(width * height, value)
    {}

    int& operator()(int x, int y)
    {
        return data[y * width + x];
    }

private:
    int width;
    std::vector<int> data;
};

int main()
{
    Matrix m(5, 10, 123);
    std::cout << m(7, 8) << "\n";
    m(7, 8) = 124;
    std::cout << m(7, 8) << "\n";
}
于 2016-02-28T20:04:22.737 に答える
1

私の希望は最後の例でしたが、 c の「内部」配列が初期化されておらず、 const であるため初期化できない場合、どのように使用できますか?

それはまったく真実ではありません。

int * const * const c = new int*[10]
{
    new int[10], new int[10], new int[10], new int[10], new int[10],
    new int[10], new int[10], new int[10], new int[10], new int[10]
};
于 2016-02-28T20:11:57.973 に答える