2009-07-05 22 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 

參考: