gpt4 book ai didi

c++ - 重新分配 vector 的内存

转载 作者:太空狗 更新时间:2023-10-29 21:40:09 25 4
gpt4 key购买 nike

我正在使用 vector<pair<int,int> > ar[100000];并且我必须将它用于多个测试用例,每次我都希望它初始化但我为此遇到了段错误。

我尝试在测试用例循环内和全局声明。对于第一个测试用例或者只有一个测试用例,它运行良好。

我也尝试在每个测试用例之后删除 vector ,但我不知道删除这种类型的 vector 的确切语法,有什么帮助吗??

int main() {
long long a, b, c, d = 0, i, j, n, m, t;
scanf("%lld", &t);
while (t--) {
scanf("%lld %lld", &n, &m);

vector<pair<long long, long long> > ar[n + 9];
for(i = 0; i < m; i++) {
scanf("%lld %lld %lld",&a,&b,&c);
ar[a - 1].push_back(make_pair(b - 1, c));
ar[b - 1].push_back(make_pair(a - 1, c));
}
vector<long long> distance(10000, 100000000);
scanf("%lld", &a);
dijkstra(ar, a - 1, distance);

for (i = 0; i < n; i++) {
if (i == a - 1)
continue;
if (distance[i] != 100000000)
printf("%lld ", distance[i]);
else {
// printf("%lld\n", visited[i]);
printf("-1 ");
}
}
printf("\n");
// ar.clear();
distance.clear();
}
return 0;
}

最佳答案

vector<pair<long long,long long> > ar[n+9];在 C++ 中是非法的。 C 风格的数组维度必须在编译时已知。

如果您的编译器允许这样做,您必须使用编译器扩展,这可能会导致您的崩溃。例如,这可能会导致堆栈溢出,尽管我们远远超出了 C++ 标准所涵盖的范围。

不使用 C 风格的数组,而是使用 vector :

vector<vector<pair<long long,long long>>> ar(n+9);

然后它是合法的,如果你用完内存你会得到一个bad_alloc抛出异常。 (为这种情况添加 catch 处理程序可能会有用)。

在使用数组索引之前,您还应该检查数组索引是否超出范围。例如:

scanf("%lld %lld %lld",&a,&b,&c);
if ( a < 1 || a > ar.size() || b < 1 || b > ar.size() )
throw std::runtime_error("Edge out of bounds");

你还应该检查 n < 10000在输入 for(i=0;i<n;i++){ 之前循环,因为 i用作 distance 的索引.事实上硬编码 10000这里似乎很可疑。

或者,使用 ar.at(a-1)而不是 ar[a-1]等,将用于进行边界检查。

关于c++ - 重新分配 vector 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31110053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com