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

C++全局vector数组在函数内显示为空的问题咨询

问题根源:同名变量的作用域冲突

哦,我一眼就看穿问题所在啦!你遇到的这个困惑其实是变量作用域隐藏的经典坑——你在全局和main函数里分别定义了一个同名的ed数组,导致你在main里操作的容器和add函数访问的容器根本不是同一个!

具体分析

  1. 你在全局区域定义了:

    vector<int> ed[100001];
    

    这个数组是全局作用域的,整个程序的函数都能访问它,但你从来没对它做过任何push_back操作。

  2. 然后在main函数里,你又声明了一个局部的ed数组:

    vector<int> ed[n];
    

    根据C++的作用域规则,局部变量的优先级高于全局变量,所以main里所有对ed的操作(比如ed[ta].push_back(tb))都是在这个局部数组上进行的——这就是为什么main里打印ed[0].size()能得到2的原因。

  3. 但你的add函数里访问的ed是全局的那个,全局的ed从头到尾都没被修改过,自然size()就是0了!

修复方法

非常简单,只需要把main里的局部ed数组定义删掉就行,直接使用全局的那个ed数组就足够了(你定义的全局数组大小是100001,完全能覆盖题目中n的取值)。

修改后的main函数开头部分:

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];
 memset(previ, -1, sizeof previ);
 for(int a = 0; a < m; a ++){
 fscanf(fi, "%d", &typ[a]);
 }
 // ... 剩下的代码保持不变
}

额外提醒

以后写代码的时候要尽量避免这种同名变量的重复定义,尤其是全局变量和局部变量同名的情况——这种隐藏问题有时候很难排查,除非你特意去检查作用域。如果确实需要区分,可以考虑使用命名空间,或者给变量起更具辨识度的名字哦!

内容的提问来源于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:03:12