美文网首页
使用std::array代替C语言里面的数组。

使用std::array代替C语言里面的数组。

作者: Roland | 来源:发表于2015-05-22 12:49 被阅读0次

C语言数组的不便之处就是求数组的长度麻烦。

对于一个数组int arr[10];,一般都这样求长度sizeof(arr) / sizeof(arr[0])。但是这里有两个麻烦不方便的地方是。

  1. 如果重构代码的时候把静态分配的数组改成了一个动态分配的数组,而忘记修改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 
    }
    
  2. 数组在作为函数参数的时候,其实退化成指针了,丢失长度信息了。比如下面的代码。

    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++的限制。

相关文章

网友评论

      本文标题:使用std::array代替C语言里面的数组。

      本文链接:https://www.haomeiwen.com/subject/zdolqttx.html