为什么我在此代码中收到运行时错误

why I am getting runtime error in this code

本文关键字:运行时错误 代码 为什么      更新时间:2023-10-16

我调试了这个,我发现它的发生是因为最后一个 for 循环v3.size(),外部循环值v3.size()0,而内部循环值是这样的18076382629293。 为什么?

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<int>> v;
int a, b, c;
map<vector<int>, int> m;
for (int i = 0; i < n; i++) {
cin >> a >> b >> c;
vector<int> v1;
v1.push_back(a);
v1.push_back(b);
v1.push_back(c);
m[v1] = i + 1;
v.push_back(v1);
// cout << 1;
}
sort(v.begin(), v.end());
// int j = i;
vector<vector<int>> v2;
for (int i = 0; i < n; i++) {
if (i == n - 1) {
v2.push_back(v[i]);
continue;
}
if (v[i][0] == v[i + 1][0]) {
if (v[i][1] == v[i + 1][1]) {
cout << m[v[i]] << " " << m[v[i + 1]] << endl;
i++;
continue;
}
}
v2.push_back(v[i]);
}
vector<vector<int>> v3;
for (int i = 0; i < v2.size(); i++) {
if (i == v2.size() - 1) {
v3.push_back(v2[i]);
continue;
}
if (v2[i][0] == v2[i + 1][0]) {
cout << m[v2[i]] << " " << m[v2[i + 1]] << endl;
i++;
continue;
}
v3.push_back(v2[i]);
}
for (int i = 0; i < v3.size() - 1; i += 2) {
cout << m[v3[i]] << " " << m[v3[i + 1]] << endl;
continue;
}
}

测试用例

阿拉伯数字

-32839949 -68986721 41592956

-32839949 -31435211 41592956

当你到达最后一个循环时,v3为空。v3.size()是一个无符号值。因此,您使用0-1作为循环上限,这(在无符号算术中(是一个巨大的值(在 64 位机器上为 264-1(。

简单的解决方法是不检查i < v3.size() - 1而是检查i + 1 < v3.size()作为循环绑定。

(编译器确实警告比较有符号和无符号值,但即使i是无符号的,问题仍然会发生。您只需要小心在小于完整容器大小的循环中的极端情况。