在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