C または C++ にジャグ配列のようなものはありますか?
これをコンパイルすると:
int jagged[][] = { {0,1}, {1,2,3} };
次のエラーが表示されます。
エラー: 多次元配列としての「ジャグ」の宣言には、最初の次元を除くすべての次元の境界が必要です
C または C++ にジャグ配列のようなものはありますか?
これをコンパイルすると:
int jagged[][] = { {0,1}, {1,2,3} };
次のエラーが表示されます。
エラー: 多次元配列としての「ジャグ」の宣言には、最初の次元を除くすべての次元の境界が必要です
CIでは、ポインターの配列を使用します。
例えば:
int *jagged[5];
jagged[0] = malloc(sizeof(int) * 10);
jagged[1] = malloc(sizeof(int) * 3);
などなど。
それを行うにはたくさんの方法があります。別の方法は次のとおりです。
int jagged_row0[] = {0,1};
int jagged_row1[] = {1,2,3};
int *jagged[] = { jagged_row0, jagged_row1 };
初期化するだけの場合は、次のように言うことができます。
int jagged[][3] = { {0,1}, {1,2,3} };
ただし、配列の形状は[2][3]のままです。真のジャグ配列が必要な場合は、動的に作成する必要があります。そして、それを行い、C ++を使用している場合はstd::vector
、friolが示唆しているように、を使用する必要があります。
C ++の場合(コンパイルされておらず、おそらくよりコンパクトな構文があります):
std::vector<std::vector<int> > myArray;
myArray.push_back(std::vector<int>());
myArray.push_back(std::vector<int>());
myArray[0].push_back(0);
myArray[0].push_back(1);
myArray[1].push_back(1);
myArray[1].push_back(2);
myArray[1].push_back(3);
これで、たとえばmyArray[0][0]などを使用して要素にアクセスできます。
エラーが発生した理由は、少なくとも外側の次元の境界を指定する必要があるためです。すなわち
int jagged[][3] = {{0,1},{1,2,3}};
jagged[0] を int の 2 要素配列にし、jagged[1] を int の 3 要素配列にすることはできません。N 要素配列は M 要素配列 (N != M) とは異なる型であり、配列のすべての要素は同じ型でなければなりません。
あなたができることは、他の人が上で提案したことであり、intへのポインターの配列としてギザギザを作成します。そうすれば、各要素は異なるサイズの整数配列を指すことができます。
int row0[] = {0,1};
int row1[] = {1,2,3};
int *jagged[] = {row0, row1};
row0 と row1 は異なる型 (int の 2 要素配列と 3 要素配列) ですが、初期化子のコンテキストでは、両方とも暗黙的に同じ型 (int *) に変換されます。
C++11 の初期化子リストを使用すると、よりコンパクトに記述できます。
#include <vector>
#include <iostream>
int main() {
// declare and initialize array
std::vector<std::vector<int>> arr = {{1,2,3}, {4,5}};
// print content of array
for (auto row : arr) {
for (auto col : row)
std::cout << col << " ";
std::cout << "\n";
}
}
出力は次のとおりです。
$ g++ test.cc -std=c++11 && ./a.out
1 2 3
4 5
参考のため:
cpp で動的割り当てを使用すると、ギザギザの配列を作成できます。
例えば:
#include<iostream>
using namespace std;
int main(){
int n;
cout<<"Enter n:";
cin>>n;
cout<<"Enter elements:";
int **p = new int *[n];
for(int i=0;i<n;i++){
p[i] = new int[i+1];
for(int j=0;j<(i+1);j++){
cin>>p[i][j];
}
}
cout<<"Jagged Array:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<(i+1);j++){
cout<<p[i][j]<<" ";
}
cout<<endl;
}
for(int i=0;i<n;i++){
delete []p[i];
}
delete []p;
}
n=3
では、次のようなジャグ配列を作成しました。
要素を入力してください:
1
1 2
1 2 3
ぎざぎざの配列:
1
1 2
1 2 3