web-dev-qa-db-ja.com

可変サイズの行を持つC ++ 2次元配列

どうすれば2D配列を作成できますか、たとえばarr[][] 5行で、各行には可変数の列がありますか?

おそらくarr[5][]1行目arr[0][]4列

2行目arr[1][] 5列など?

STLベクトルソリューションは気になりませんが、ベクトルについてはまだよくわかりません。

12
user1484717

C++ 11では、ベクトルを使用して簡単に行うことができます(読みやすくするために改行が追加されています)。

std::vector< std::vector <int > > arr = {
{1,2,3},
{4,5},
{6,7,8,9,0}
};

C++ 11コンパイラがない場合は、まったく同じように機能しますが、簡単に初期化することはできません。要素は個別に設定できます。

std::vector< std::vector <int > > arr;//vector of vectors. Think of each element as of a "row"
std::vector<int> sub;//a temporary "row"
sub.Push_back(1);
sub.Push_back(2);
arr.Push_back(sub);//Adding a "row" to the vector
sub.clear();//Making another one
sub.Push_back(1);
sub.Push_back(12);
sub.Push_back(54);
arr.Push_back(sub);//Adding another "row" to the vector

または、通常の配列を使用して各「行」を初期化できます。

std::vector< std::vector <int > > arr;
static const int arr[] = {1,2,3,4};//A "row" as an ordinary array
vector<int> vec (arr, arr + sizeof(arr) / sizeof(arr[0]) ); //Setting a "Row" as a vector
arr.Push_back(vec);//Adding the "row" to the vector of vectors. 

array[X][Y]を作成すると、自動的にX*Y行列になるため、通常の配列で目的を実行することは正確には不可能です。ただし、ポインタの配列を使用することはできます。

int * array[3];
//also possible: int ** array =  new int*[3]; but don't forget to delete it afterwards.
int sub1[3] = {1,2,3};
int sub2[2] = {1,2};
int sub3[4] = {1,2,3,4};
array[0] = sub1;
array[1] = sub2;
array[2] = sub3;

array[X][Y]で要素にアクセスします。ただし、ベクトルソリューションは全体的にはるかに優れています。

17
SingerOfTheFall

このように行うことができます(int要素の配列を想定):

int** arr = new int*[5];
for(size_t i = 0; i < 5; ++i)
{
    arr[i] = new int[4];
}

これにより、5 x 4の2次元の動的に割り当てられた配列が得られます。その後、次のように使用できます。arr[i][j] = 15;

アレイの使用が終了したら、メモリの割り当てを解除することを忘れないでください。

for(size_t i = 0; i < 5; ++i)
{
    delete[] arr[i];
}
delete[] arr;

ただし、std::vectorを使用することをお勧めします。参考までに他の回答を見ることができます。

7

行サイズを変える方法

#include <iostream>
#include <string>
int main()
{
  int test1[]={1,2,3};
  int test2[]={4,5};

  int *test[]={test1,test2};

  std::cout << test[0][1];//2
  std::cout << test[1][1];//5
}
0
reza moradi