2009-07-05 64 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++,你应该使用std::vector,正如friol所建议的那样。

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 2009-07-05 09:01:33

21

在CI中会使用指针数组。

例如:

int *jagged[5]; 

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

等等等等

+0

在这个例子中,释放内存的正确方法是什么? – papgeo 2017-06-29 13:57:47

15

有一堆的方法来做到这一点。这里的另一种方式:

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}};`也不是很好吗? – 2009-07-05 09:08:16

+2

这个解决方案的麻烦是子数组立即衰变为指针,所以你无法告诉边界是什么。 – 2009-07-05 09:36:42

2

在C99,你可以做到以下几点:

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} }; 

这里唯一的不同(与风铃草的回答)是的阵列不衰减到指针和一个具有(例如*jagged[0]-和每行的大小必须被记录 - 即,sizeof(*jagged[0])将不能编译) - 但它们看起来很锯齿;)

3

你得到错误的原因是你m ust至少指定外部维度的边界;即

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

不能有锯齿状[0]是int和锯齿状[1]是int的3元件阵列的2个元素的数组; N元素数组与M元素数组(其中N!= M)是不同的类型,并且数组中的所有元素都必须是相同的类型。

可以做的是别人在上面提出的建议,并创建锯齿作为int指针数组;这样每个元素可以指向整数不同大小的阵列:

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

即使ROW0和ROW1是不同的类型(int的2元件对3-元件阵列),在它们的初始值设定的范围内都隐式转换为相同的类型(int *)。

1

用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 

参考: