如何在C++中于main函数外初始化全局二维数组为-1
在main函数外初始化全局二维数组为-1的可行方案
你尝试在全局域直接写for循环初始化数组导致报错,原因是全局作用域仅允许声明、定义或静态初始化语句,不能直接放置执行代码(比如for循环这类运行时语句)。以下是几种无需修改main函数的解决方案:
方案1:借助全局对象构造函数 + memset
利用全局对象在main执行前自动构造的特性,在构造函数中用memset批量初始化数组:
#include<iostream> #include<vector> #include<algorithm> #include<cstring> // 必须包含memset的头文件 using namespace std; int dp[10][100]; // 定义全局辅助结构体,构造时完成初始化 struct InitDP { InitDP() { // memset将数组每个字节设为-1,int类型的补码特性会让整数值为-1 memset(dp, -1, sizeof(dp)); } } init_dp; // 全局实例,程序启动时自动执行构造函数 int knapsack(vector<int>wt,vector<int>val,int w,int n){ if(w==0 || n==0){ return 0; } if(dp[n][w]!=-1){ return dp[n][w]; } if(wt[n-1]<=w){ return dp[n][w]=max(val[n-1]+knapsack(wt,val,w-wt[n-1],n-1), knapsack(wt,val,w,n-1)); } else{ return dp[n][w]=knapsack(wt,val,w,n-1); } } int main(){ vector<int>val={60,100,120}; vector<int>wt={10,20,30}; int w=60; int n=val.size(); cout<<knapsack(wt,val,w,n); }
方案2:借助全局对象构造函数 + std::fill
如果觉得memset依赖字节补码不够直观,可使用std::fill逐行填充,可读性更强:
#include<iostream> #include<vector> #include<algorithm> #include<iterator> // 用于begin/end函数 using namespace std; int dp[10][100]; // 初始化函数 void initDP() { for (auto& row : dp) { fill(begin(row), end(row), -1); } } // 全局对象触发初始化 struct InitDP { InitDP() { initDP(); } } init_dp; int knapsack(vector<int>wt,vector<int>val,int w,int n){ if(w==0 || n==0){ return 0; } if(dp[n][w]!=-1){ return dp[n][w]; } if(wt[n-1]<=w){ return dp[n][w]=max(val[n-1]+knapsack(wt,val,w-wt[n-1],n-1), knapsack(wt,val,w,n-1)); } else{ return dp[n][w]=knapsack(wt,val,w,n-1); } } int main(){ vector<int>val={60,100,120}; vector<int>wt={10,20,30}; int w=60; int n=val.size(); cout<<knapsack(wt,val,w,n); }
方案3:编译期静态初始化(C++11及以上)
如果数组尺寸固定且编译器支持C++11,可直接用初始化列表完成全量初始化(适合小尺寸数组):
#include<iostream> #include<vector> #include<algorithm> using namespace std; // 手动写出所有元素的初始化列表,每行100个-1 int dp[10][100] = { {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, // 重复上述行共10次 {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */}, {-1,-1,.../* 100个-1 */} }; int knapsack(vector<int>wt,vector<int>val,int w,int n){ if(w==0 || n==0){ return 0; } if(dp[n][w]!=-1){ return dp[n][w]; } if(wt[n-1]<=w){ return dp[n][w]=max(val[n-1]+knapsack(wt,val,w-wt[n-1],n-1), knapsack(wt,val,w,n-1)); } else{ return dp[n][w]=knapsack(wt,val,w,n-1); } } int main(){ vector<int>val={60,100,120}; vector<int>wt={10,20,30}; int w=60; int n=val.size(); cout<<knapsack(wt,val,w,n); }
注:此方法适合数组尺寸较小的场景,大尺寸数组会导致代码冗余,更推荐方案1或2。
内容的提问来源于stack exchange,提问作者def init
相关产品推荐
相关产品推荐

