zoukankan      html  css  js  c++  java
  • 关于大数组定义为全局变量和内部变量的一些区别

    什么是全局变量和main函数中的变量

    在我个人浅显的理解下,我所认为的全局变量就是定义在函数外部,作用于整个代码的变量类型
    而定义在函数中的变量就是只作用于该函数内部的变量
    这两者除此之外再无区别

    当我刷了一段时间的题后~尤其是当我们今天看到dp背包问题的模板题时,我对这两者又有了不一样的认识和感受

    情形如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1010;
    int main()
    {
       int n, m;
       int v[N], w[N];
       int f[N][N];
    
       cin >> n >> m;
    
       for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    
       for (int i = 1; i <= n; i ++ )
           for (int j = 1; j <= m; j ++ )
           {
               f[i][j] = f[i - 1][j];
               if (j >= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
           }
    
       cout << f[n][m] << endl;
    
       return 0;
    }
    

    这是一个再简单不过的完全背包的模板题,当这个题在一些在线评测oj中都可以顺利AC
    !!
    但是,当我的这种写法在我本地的IDE(VScode)中运行时,发现了无法输入然后一段时间后自动退出程序的现象
    起初我一直以为是代码出错
    但是后来我才明白是我对于大数组的定义出现了问题。

    错误原因

    我在上述代码中对于大数组的定义为内部变量
    数组定义在函数中会占用 栈空间 ,而往往栈空间比较小,所以大数组定义在函数中会出现内存方面的问题
    但是如果将数组定义为全局变量 则分配在 数据段,则不存在所谓的内存问题咯

    正确的代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 1010;
    int n, m;
    int v[N], w[N];
    int f[N][N];
    int main()
    {
        cin >> n >> m;
        for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
            {
                f[i][j] = f[i - 1][j];
                if (j >= v[i]) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]);
            }
    
        cout << f[n][m] << endl;
    
        return 0;
    }
    

    总结

    我们一般不喜欢使用全局变量无非是害怕全局变量浊化变量名称、占用更大的内存等等,但是当大数组出现时,我们一定要记得的将大数组定义在函数外部!

    (希望我的上述总结能够为你带来一些收获,大一菜鸡的一点点小想法,如有思路内容不妥之处,还望各位大佬前辈不吝赐教)

  • 相关阅读:
    寒假学习第六天
    寒假学习第五天
    寒假学习第四天
    spark生态体系了解学习(六)
    spark生态体系了解学习(五)
    spark生态体系了解学习(四)
    spark生态体系了解学习(三)
    spark生态体系了解学习(二)
    spark生态体系了解学习(一)
    共享
  • 原文地址:https://www.cnblogs.com/TOBEACODER/p/12571393.html
Copyright © 2011-2022 走看看