You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:15:56