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
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
あなたはそれを初期化したい場合は、あなたが言うことができます。
int jagged[][3] = { {0,1}, {1,2,3} };
が、配列は、まだ形状[2] [3]を持ちます。真のギザギザの配列が必要な場合は、それを動的に作成する必要があります。そして、あなたがそれを行い、C++を使用しているなら、friolが示唆するようにstd::vector
を使うべきです。
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]、など
In CIでは、ポインタの配列を使用します。例えば
:
int *jagged[5];
jagged[0] = malloc(sizeof(int) * 10);
jagged[1] = malloc(sizeof(int) * 3);
などなど
この例では、メモリを解放する正しい方法は何ですか? – papgeo
それを行うための方法の束があります。ここでは別の方法があります:
次の操作を行うことができC99でint jagged_row0[] = {0,1};
int jagged_row1[] = {1,2,3};
int *jagged[] = { jagged_row0, jagged_row1 };
+1。これは、C99の複合リテラルが表示される場所です。 'int * jagged [] = {(int []){0,1}、(int []){1,2,3}};'あまりにもいいですか? –
このソリューションの問題は、サブアレイがすぐにポインタに崩壊するため、境界が何であるかを伝える手段がないことです。 –
@Neil、私はこれについて全く考えなかった。もちろんあなたは正しいです。良い点:) –
:
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])
コンパイルされません) - 個々の間接の別のレベルを経由して配列にアクセスするには、彼らがギザギザに見える骨にしている;)
私はあなたが不完全な型の配列を作ることができないと思った...ああ、あなたは不完全な型へのポインタの配列を作っています、それは可能ですが、あなたはrampionの答えよりも何も買わない。 –
あなたがエラーを持っている理由は、あなたが少なくとも外側の次元の境界を指定してください。即ち
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の初期化リストを
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
:
ポインタを保持していないベクトルにポインタを押し込んでいます... – Goz