首页 > 解决方案 > 在以下 cpp 代码中出现 SIGESV 错误

问题描述

在以下 cpp 代码中出现 SIGESV 错误,请检查。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int t;
  cin >> t;
  while (t--) {
    int n, m;
    int sa = 0, sb = 0, c = 0;
    cin >> n >> m;
    vector<int> a;
    for (int i = 0; i < n; i++) {
      cin >> a[i];
    }
    vector<int> b;
    for (int i = 0; i < m; i++) {
      cin >> b[i];
    }
    int k = min(n, m);

    while (k--) {
      sa = accumulate(a.begin(), a.end(), 0);
      sb = accumulate(b.begin(), b.end(), 0);
      if (sb >= sa) {
        swap(*min_element(a.begin(), a.end()),
             *max_element(b.begin(), b.end()));

        c++;
      } else {
        break;
      }
    }
    if (sb >= sa) {
      cout << "-1" << endl;
    } else {
      cout << c << endl;
    }
  }

  return 0;
}

该代码要求两个数组,并且仅当数组 a 的总和小于数组 b 时才交换。作为 SIGESV 出现错误,也可以将 'b' 数组作为输入,怎么办?

标签: c++vector

解决方案


向量 a 的大小和容量为 0,并且永远不会改变。

此代码已损坏:

vector<int> a;
for(int i=0;i<n;i++){
    cin>>a[i];
}

operator[]()不增长向量。您正在为不属于 的内存分配值a

a.push_back(i)至少想要。您可能真正想要的是:

vector<int> a;
a.reserve(n);
for (int i = 0; i < n; ++i) {
    int tmp;
    cin >> tmp;
    a.push_back(tmp);
}

保留内存会阻止向量重新分配。不在构造函数中执行此操作也会停止所有元素的默认初始化。

b向量也是如此。

您也永远不会更改saor的值sb,但这不应该使任何东西崩溃,这只是我所看到的逻辑错误。

整个文件也充斥着不良做法。“竞争性”编码网站积极地使您成为更差的程序员。


推荐阅读