2009-07-05 7 views
23

CやC++にギザギザのような配列がありますか?C/C++にギザギザの配列がありますか?

私はこのコンパイルするとき:

int jagged[][] = { {0,1}, {1,2,3} }; 

を、私はこのエラーを取得する:

error: declaration of `jagged' as multidimensional array must have bounds for all dimensions except the first

答えて

14

あなたはそれを初期化したい場合は、あなたが言うことができます。

int jagged[][3] = { {0,1}, {1,2,3} }; 

が、配列は、まだ形状[2] [3]を持ちます。真のギザギザの配列が必要な場合は、それを動的に作成する必要があります。そして、あなたがそれを行い、C++を使用しているなら、friolが示唆するようにstd::vectorを使うべきです。

12

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]、など

+1

ポインタを保持していないベクトルにポインタを押し込んでいます... – Goz

21

In CIでは、ポインタの配列を使用します。例えば

int *jagged[5]; 

jagged[0] = malloc(sizeof(int) * 10); 
jagged[1] = malloc(sizeof(int) * 3); 

などなど

+0

この例では、メモリを解放する正しい方法は何ですか? – papgeo

15

それを行うための方法の束があります。ここでは別の方法があります:

次の操作を行うことができC99で
int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 
int *jagged[] = { jagged_row0, jagged_row1 }; 
+3

+1。これは、C99の複合リテラルが表示される場所です。 'int * jagged [] = {(int []){0,1}、(int []){1,2,3}};'あまりにもいいですか? –

+2

このソリューションの問題は、サブアレイがすぐにポインタに崩壊するため、境界が何であるかを伝える手段がないことです。 –

+0

@Neil、私はこれについて全く考えなかった。もちろんあなたは正しいです。良い点:) –

2

int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 

int (*jagged[])[] = { &jagged_row0, &jagged_row1 }; // note the ampersand 

// also since compound literals are lvalues ... 
int (*jagged2[])[] = { &(int[]){0,1}, &(int[]){1,2,3} }; 

ここ(ホタルブクロの答えと比較して)唯一の違いは、配列はポインタに減衰していない、もう1つは持っているということです(例えば*jagged[0] - - と、各行のサイズを記録する必要がある - すなわちsizeof(*jagged[0])コンパイルされません) - 個々の間接の別のレベルを経由して配列にアクセスするには、彼らがギザギザに見える骨にしている;)

+0

私はあなたが不完全な型の配列を作ることができないと思った...ああ、あなたは不完全な型へのポインタの配列を作っています、それは可能ですが、あなたはrampionの答えよりも何も買わない。 –

3

あなたがエラーを持っている理由は、あなたが少なくとも外側の次元の境界を指定してください。即ち

int jagged[][3] = {{0,1},{1,2,3}}; 

あなたがギザギザしていることができない[0] INTとギザギザの2素子アレイである[1] INTの3要素の配列です。 N要素配列はM要素配列(N!= M)とは異なる型であり、配列のすべての要素は同じ型でなければなりません。

あなたは何ですか doは他の人が先に提案したものであり、intへのポインタの配列としてギザギザを作​​成しています。その方法は、各要素は、異なるサイズのアレイを整数を指すことができる。

int row0[] = {0,1}; 
int row1[] = {1,2,3}; 
int *jagged[] = {row0, row1}; 

ROW0とROW1はそれらが初期の文脈における異なるタイプ(INTの2素子対3素子アレイ)であるにもかかわらず暗黙のうちに同じ型(int *)に変換されます。C++ 11の初期化リストを

1

thisをよりコンパクトに書くことができる。

#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 

関連する問題