C++全局vector数组在函数内显示为空的问题咨询
问题根源:同名变量的作用域冲突
哦,我一眼就看穿问题所在啦!你遇到的这个困惑其实是变量作用域隐藏的经典坑——你在全局和main函数里分别定义了一个同名的ed数组,导致你在main里操作的容器和add函数访问的容器根本不是同一个!
具体分析
你在全局区域定义了:
vector<int> ed[100001];这个数组是全局作用域的,整个程序的函数都能访问它,但你从来没对它做过任何
push_back操作。然后在
main函数里,你又声明了一个局部的ed数组:vector<int> ed[n];根据C++的作用域规则,局部变量的优先级高于全局变量,所以
main里所有对ed的操作(比如ed[ta].push_back(tb))都是在这个局部数组上进行的——这就是为什么main里打印ed[0].size()能得到2的原因。但你的
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
相关产品推荐
相关产品推荐

