在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++,你應該使用std::vector
,正如friol所建議的那樣。
在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],等等。
在CI中會使用指針數組。
例如:
int *jagged[5];
jagged[0] = malloc(sizeof(int) * 10);
jagged[1] = malloc(sizeof(int) * 3);
等等等等
在這個例子中,釋放內存的正確方法是什麼? – papgeo 2017-06-29 13:57:47
有一堆的方法來做到這一點。這裏的另一種方式:
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}};`也不是很好嗎? – 2009-07-05 09:08:16
這個解決方案的麻煩是子數組立即衰變爲指針,所以你無法告訴邊界是什麼。 – 2009-07-05 09:36:42
在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])
將不能編譯) - 但它們看起來很鋸齒;)
你得到錯誤的原因是你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 *)。
用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 2009-07-05 09:01:33