美文网首页
使用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