C / C ++中是否存在锯齿状的数组?
在C或C ++中是否有这样一个锯齿状的数组?
当我编译这个:
int jagged[][] = { {0,1}, {1,2,3} };
我得到这个错误:
错误:作为multidimensional array的“锯齿”声明必须对除第一个以外的所有维都有界限
在CI中会使用一个指针数组。
例如:
int *jagged[5]; jagged[0] = malloc(sizeof(int) * 10); jagged[1] = malloc(sizeof(int) * 3);
等等
有很多方法可以做到这一点。 这是另一种方式:
int jagged_row0[] = {0,1}; int jagged_row1[] = {1,2,3}; int *jagged[] = { jagged_row0, jagged_row1 };
如果你只是想初始化它,你可以说:
int jagged[][3] = { {0,1}, {1,2,3} };
但数组仍然具有[2] [3]的形状。 如果你想要一个真正的参差不齐的数组,你将不得不dynamic创build它。 如果你这样做,并正在使用C ++,你应该使用std::vector
,正如friol所build议的那样。
在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]等
你得到这个错误的原因是你必须指定至less外部尺寸的边界; 即
int jagged[][3] = {{0,1},{1,2,3}};
你不能有锯齿[0]是一个2元素的int和参差不齐的数组[1]是一个3元素的int数组; N元素数组与M元素数组(其中N!= M)是不同的types,并且数组的所有元素都必须是相同的types。
你可以做的是其他人在上面提出的build议,并创build一个int指针数组锯齿状; 这样每个元素可以指向不同大小的整数数组:
int row0[] = {0,1}; int row1[] = {1,2,3}; int *jagged[] = {row0, row1};
即使row0和row1是不同的types(int的2元素和3元素数组),在初始化器的上下文中,它们都被隐式转换为相同的types(int *)。
在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} };
这里唯一的区别(与rampion的答案相比)是数组不会衰减到指针,并且必须通过另一个间接级别访问单个数组(例如*jagged[0]
,并且每行的大小被logging – 即sizeof(*jagged[0])
将不会编译) – 但他们是锯齿状的骨头;)
用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
以供参考: