C语言数组的不便之处就是求数组的长度麻烦。
对于一个数组int arr[10];
,一般都这样求长度sizeof(arr) / sizeof(arr[0])
。但是这里有两个麻烦不方便的地方是。
-
如果重构代码的时候把静态分配的数组改成了一个动态分配的数组,而忘记修改
sizeof(arr) / sizeof(arr[0])
了。那么程序就出错了,编译器没有办法检查出这个错误。比如,下面的代码。void foo(){ //int arr[10]; int *arr = new int[10]; // for some reason, now use new to alloc array. int len = sizeof(arr) / sizeof(arr[0]); // still valid in compiler }
-
数组在作为函数参数的时候,其实退化成指针了,丢失长度信息了。比如下面的代码。
void foo(int arr[10]){ /* sizeof on array function parameter will return size of 'int *' instead of 'int [10]*/ std::cout << sizeof(arr) << std::endl; } void bar(){ int arr[9]; foo(arr); }
std::array的一些局限。
std::array基本上都能代替原来的数组了。它的size不会丢失了,它是个std的容器了,它可以直接用=
赋值了。
void foo(std::array<int, 10> arr){
int len = arr.size();
std::array<int, 10> k = arr;
k = arr;
for (auto m : arr){
std::cout << m;
};
}
当然std::array也有一些局限,比如说int arr[]={1,2,3,4};
这个依靠初始化列表里面的元素来决定大小的方式std::array没办法实现。
还有就是在调试的时候,查看std::array里面的内容会稍微麻烦一点。如下例,没法直接用std_arr[2]
来查看里面的值了。这在数组很大的时候不是特别方便。
解决方法是展开std_arr
,然后选中其中的一个元素Add Watch。然后就可以随便修改[]
里面的值来看你想看的东西了。比如说我改成了1000也没有关系(((&(std_arr)))->_Elems)[1000]
,这是在调试器里面,不受C++的限制。