zoukankan      html  css  js  c++  java
  • 论C++如何优雅的使用数组

    C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码:

    //数组arr的大小未知。
    int arrsize(int arr*) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1
    }
    • 1
    • 2
    • 3
    • 4

    在上面那段代码中不仅得到的数组大小是不正确的,还会出现让调用则不明白是传递int变量的地址,还是传递一个指针(数组),为了解决第二个歧义现象,我们可以定义如下:

    //数组arr的大小依旧未知。
    int arrsize(int arr[]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1
    }
    • 1
    • 2
    • 3
    • 4

    即使我们按上面那种定义,但数组的的大小我们依旧不知道,但现在编译器还会提示类似如下警告:

     warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]
    • 1

    为了更好的解决上面的问题我们可以考虑使用一个引用形参,可以有如下代码:

    //数组arr的大小必须是12,否则会报错。
    int arrsize_const_size(int (&arr)[12]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    即使我们使用引用形参解决了,在函数内部我们无法正确获取数组大小的问题,但更复杂的问题出现了,我们只能接受固定数量的大小的数组,解决这个问题,我们可以通过一种很常规的手法定义函数如下:

     //指定一个数组大小n
    int arrsize_n(int arr[], int n) {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面虽然解决了,但我们多传递了一个参数,调用代码看起来没有前两个更加简洁了,虽然问题被很好的解决了,为了更好的解决这个问题我们可以把推断数组大小的事交个编译器,使用非类型模板参数。

    template<int n>
    int arrsize_template_size(int (&arr)[n]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12
      cout << "n : " << n << endl;//12
      for (int i = 0; i < n; i++) {
        cout << "arr[" << i << "] = " << arr[i] << endl;
      }
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    下面给出完整的测试代码:

    #include <iostream>
    
    using namespace std;
    
    
    //数组arr的大小未知。
    int arrsize(int arr[]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//1
      return 0;
    }
    //数组arr的大小必须是12,否则会报错。
    int arrsize_const_size(int (&arr)[12]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12
      return 0;
    }
    
    //指定一个数组大小n
    int arrsize_n(int arr[], int n) {
      return 0;
    }
    
    template<int n>
    int arrsize_template_size(int (&arr)[n]) {
      cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12
      cout << "n : " << n << endl;//12
      for (int i = 0; i < n; i++) {
        cout << "arr[" << i << "] = " << arr[i] << endl;
      }
      return 0;
    }
    
    int main() {
    
      int arr[12] = {
        1, 2, 3, 4,
        5, 6, 7, 8,
        9, 10, 11, 12,
      };
      int arr1[16] = {
        1, 2, 3, 4,
        5, 6, 7, 8,
        9, 10, 11, 12,
        13, 14, 15, 16,
      };
    
      arrsize(arr);
      arrsize_const_size(arr);
      cout << "-------------------------------------" << endl;
      arrsize_template_size(arr);
      cout << "-------------------------------------" << endl;
      arrsize_template_size(arr1);
      cout << "-------------------------------------" << endl;
      return 0;
    }

    如果array类型也是复用的话,那么就有最终版本:

    template<typename T,int n>
            void print_arr_in_tpl(T (&arr)[n]){
                std::cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << std::endl;//
                for(int i=0;i<n;++i){
                    std::cout<<arr[i]<<std::endl;
                }
            }

    哈哈, 大家拿去用吧




  • 相关阅读:
    java Class.getResource和ClassLoader.getResource
    Ext Grid控件的配置与方法
    BLANK_IMAGE_URL
    js中变量和jsp中java代码中变量互相访问解决方案
    PL/SQL
    滴滴2021后端开发岗笔试:
    顺丰科技2021研发岗笔试:贪心算法应用
    2021顺丰科技研发笔试: 深度优先算法的应用
    动态规划算法轻松解决01背包,完全背包,多重背包问题
    寻找二叉树的最近公共祖先
  • 原文地址:https://www.cnblogs.com/sunsky303/p/7711388.html
Copyright © 2011-2022 走看看