为什么在此代码中出现运行时错误

时间:2019-10-18 07:52:01

标签: c++

我对此进行了调试,发现它是由于最后一个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;
  }
}

测试用例

2

-32839949 -68986721 41592956

-32839949 -31435211 41592956

1 个答案:

答案 0 :(得分:3)

进入最后一个循环时,

v3为空。 v3.size()是一个无符号值。因此,您将0-1用作循环的上限,(以无符号算法)这是一个很大的值(在64位计算机上为2 64 -1)。

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

(编译器确实会警告比较有符号和无符号的值,但是即使i是无符号的,仍然会出现问题。当循环使用小于a的整数时,您只需要小心一点完整的容器尺寸。)