为何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
相关产品推荐
相关产品推荐

