web-dev-qa-db-ja.com

2D配列値C ++

Forループを実行せずに、2D配列を宣言して値を割り当てたいと思いました。

私は次のアイデアを使用できると思った

int array[5] = {1,2,3,4,5};

これは2D配列を初期化するのにもうまく機能します。しかし、明らかに私のコンパイラはこれが好きではありません。

/*
 1   8  12  20  25
 5   9  13  24  26
*/

#include <iostream.h>

int main()
{
    int arr[2][5] = {0};   // This actually initializes everything to 0.
    arr [1] [] = {1,8,12,20,25}; // Line 11
    arr [2] [] = {5,9,13,24,26};
    return 0;
}

J:\ CPP\Grid> bcc32.exe Grid.cpp

Win32向けBorland C++ 5.5.1 Copyright(c)1993、2000 Borland

Grid.cpp:

エラーE2188 Grid.cpp 11:関数main()の式の構文

エラーE2188 Grid.cpp 12:関数main()の式構文

警告W8004 Grid.cpp 14: 'arr'には、関数main()で使用されない値が割り当てられます

*コンパイルで2つのエラー*

私の値のセットで2D配列を初期化する正しい方法は何かを助けてください。

34
Kingkong Jnr

このような:

int main()
{
    int arr[2][5] =
    {
        {1,8,12,20,25},
        {5,9,13,24,26}
    };
}

これはC++の教科書でカバーする必要があります。どちらを使用していますか?

とにかく、std::vectorまたはいくつかの既製のマトリックスクラス。 Boostから。

53

CまたはC++で多次元配列を初期化する適切な方法は

int arr[2][5] = {{1,8,12,20,25}, {5,9,13,24,26}};

必要に応じて、この同じトリックを使用して、より高次元の配列を初期化することもできます。

また、初期コードに注意してください-1インデックス付きオフセットを使用して配列を初期化しようとしていました。これはコンパイルされませんでしたが、C配列のインデックスが0であるため問題が発生します。

9
templatetypedef

配列のすべての次元を指定する必要がないことを指摘したいだけです。

コンパイラは、左端の次元を「推測」できます。

#include <stdio.h>
int main(void) {
  int arr[][5] = {{1,2,3,4,5}, {5,6,7,8,9}, {6,5,4,3,2}};
  printf("sizeof arr is %d bytes\n", (int)sizeof arr);
  printf("number of elements: %d\n", (int)(sizeof arr/sizeof arr[0]));
  return 0;
}
8
pmg

int iArray[2][2] = {{1, 2}, {3, 4}};

2D配列は配列の配列と考えてください。

5
Avery3R

1つの選択肢は、2D配列を1D配列として表すことです。これにより、要素ごとの操作がより効率的になります。おそらく幅と高さも含むクラスでラップする必要があります。

別の方法は、2D配列をstd::vector<std::vector<int> >として表すことです。これにより、配列演算にSTLのアルゴリズムを使用できるようになり、ベクトルもメモリ管理を処理します。

0
Dima