Java和C++的数组比较
Java:
数组的定义:
如下两种方式都可以:
int array[];
int[] array;
注意:数组在定义后,不能直接使用。必须在初始化后才能使用。
初始化有两种方式:
1、静态初始化:
int array[] = {2,3,4};
2、动态初始化:
array = new int[2];
array[0] = 0;
array[1] = 1;
array[2] = 2; // 这句话没有语法错误,运行时会触发异常:java.lang.ArrayIndexOutOfBoundsException
可以通过length获取数组的长度:
System.out.println(array.length); // array.length将会返回2
注意:不能在[]中指定数组的大小。
二维数组:
int array[ ][ ] = { {1, 2}, {2, 3}, {4, 5} };
二维数组的长度计算如下:
System.out.println(array.length); // array.length返回3
System.out.println(array[1].length); // array[1].length返回2
二维数组中可以看作是数组的数组;第1维(维数从0开始)中不同的元素(一维数组)的长度可以不同:
int array[ ][ ] = { {1, 2}, {2, 3}, {4, 5, 6} };
System.out.println(array[0].length); // array[0].length返回2
System.out.println(array[1].length); // array[1].length返回2
System.out.println(array[2].length); // array[2].length返回3
C++:
声明数组时要指定数组元素的数量:
int array[2];
声明后,即可使用:
array[0] = 0;
array[1] = 1;
array[2] = 2; // 这句话没有语法错误,运行时也没有做任何检查。后果不可预料,极度危险。
数组可以在声明的同时初始化:
int array[2] = {0, 1}; // 若列表中元素的个数必须小于或等于声明中的元素个数,否则,编译会出错。
可以省略声明中的元素个数:
int array[] = {0, 1};
注意:int[] array是不符合语法的;int array[]也是不符合语法的(如果要这么写,那么必须在声明的同时进行初始化)。
获取数组长度:
cout << sizeof(array) / sizeof(int);
或者:
cout << std::extent<decltype(array)>::value << endl;
decltype是C++11的特性;std::extent在头文件type_traits中。
二维数组:
int array[3][2] = { {1, 2}, {2, 3}, {4, 5} };
只有第一维的长度可以省略:
int array[][2] = { {1, 2}, {2, 3}, {4, 5} };
数组必须是个方方正正的矩阵,第1维(维数从0开始)的每一个元素(一维数组)的长度必须相当。
对于上述二维数组:
cout << sizeof(array) / sizeof(int) << endl; // 返回6
cout << std::extent<decltype(array)>::value << endl; // 返回第0维的长度,3
cout << std::extent<decltype(array), 1>::value << endl; // 返回第1维的长度,2
注意:std::extent的声明如下:
template<class T, unsigned N = 0>
struct extent;