34

C または C++ にジャグ配列のようなものはありますか?

これをコンパイルすると:

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

次のエラーが表示されます。

エラー: 多次元配列としての「ジャグ」の宣言には、最初の次元を除くすべての次元の境界が必要です

4

11 に答える 11

28

CIでは、ポインターの配列を使用します。

例えば:

int *jagged[5];

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

などなど。

于 2009-07-05T08:31:34.483 に答える
18

それを行うにはたくさんの方法があります。別の方法は次のとおりです。

int jagged_row0[] = {0,1};
int jagged_row1[] = {1,2,3};
int *jagged[] = { jagged_row0, jagged_row1 };
于 2009-07-05T08:58:26.283 に答える
16

初期化するだけの場合は、次のように言うことができます。

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

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

于 2009-07-05T08:17:48.847 に答える
13

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]などを使用して要素にアクセスできます。

于 2009-07-05T08:21:38.963 に答える
4

エラーが発生した理由は、少なくとも外側の次元の境界を指定する必要があるためです。すなわち

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 *) に変換されます。

于 2009-07-17T15:28:40.850 に答える
4

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 

参考のため:

于 2014-11-12T19:14:58.367 に答える
1

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では、次のようなジャグ配列を作成しました。

  • n: 3を入力してください

要素を入力してください:
1
1 2
1 2 3
ぎざぎざの配列:
1
1 2
1 2 3

于 2020-09-14T10:25:03.197 に答える