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

为何C++全局vector数组在函数中显示为空?附代码示例

问题解决:Vector在自定义函数中显示为空的原因

你这问题其实是踩了变量作用域冲突的坑!咱们来拆解一下:

你在全局区域定义了vector<int> ed[100001],但在main函数里又重新写了一行vector<int> ed[n];——这就相当于在main的局部范围内创建了一个和全局变量同名的新数组,直接把全局的ed给“覆盖”了。

带来的后果就是:

  • 你在main里用push_back给ed加元素,都是往局部的ed数组里加,全局的ed根本没碰过
  • 而你的add函数访问的是全局的ed数组,这个全局数组自始至终都没被初始化或添加过元素,所以它的size自然是0

另外还要提醒你代码里的一个小bug:if(previ[a] = -1)这里用的是赋值运算符=,不是判断相等的==,这会导致逻辑完全错误,必须改成==。

修改后的代码:

#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
int previ[100001], typ[100001], lvl[100001];
vector<int> ed[100001]; // 全局的ed数组,保持不变
void add(int toadd, int pre, int lv){
    previ[toadd] = pre;
    lvl[toadd] = lv;
    printf("%d\n", ed[0].size()); // 现在会正确输出2
    for(int &a: ed[toadd]){
        if(previ[a] == -1){ // 修正为相等判断
            add(a, toadd, lv + 1);
        }
    }
}
int main(){
    FILE *fi = fopen("milkvisits.in", "r"), *fo = fopen("milkvisits.out", "w");
    int n, m;
    fscanf(fi, "%d %d", &n, &m);
    // 删掉这行:vector<int> ed[n]; 不再定义局部的ed数组
    memset(previ, -1, sizeof previ);
    for(int a = 0; a < m; a ++){
        fscanf(fi, "%d", &typ[a]);
    }
    int ta, tb;
    for(int a = 1; a < n; a ++){
        fscanf(fi, "%d %d", &ta, &tb);
        ta--; tb --;
        ed[ta].push_back(tb);
        ed[tb].push_back(ta);
    }
    printf("%d\n", ed[0].size()); // 输出2
    add(0, -2, 1); // 函数内现在会正确输出2
    printf("%d\n", ed[0].size()); // 输出2
    fclose(fi);
    fclose(fo);
    return 0;
}

这样修改之后,main里的操作都会直接作用在全局的ed数组上,add函数就能访问到正确的元素了。

内容的提问来源于stack exchange,提问作者Alvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:00:23