繁体   English   中英

为什么我在这段代码中遇到运行时错误

[英]why I am getting runtime error in this code

我对此进行了调试,发现它发生是因为v3.size()在最后一个 for 循环中, 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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM