c++ - 在以下 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' 数组作为输入,怎么办?
解决方案
向量 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
向量也是如此。
您也永远不会更改sa
or的值sb
,但这不应该使任何东西崩溃,这只是我所看到的逻辑错误。
整个文件也充斥着不良做法。“竞争性”编码网站积极地使您成为更差的程序员。
推荐阅读
- java - 通过其 api 将文件上传到 Redmine
- sharepoint - Powerapps Gallery 无法在 sharepoint 上显示新添加的文件
- node.js - 全栈 NextJS 应用程序
- docker - 如何在 Windows 10 主机中的 virtualbox vm 机器 macOS big sur 中运行 docker
- java - JFreeChart 显示每个 x 轴数据的值
- django - 从套接字读取时 Heroku Redis 错误:(104,'对等连接重置')
- python - 如何区分单元测试和集成测试?
- c# - 外部登录生产后 2FA 无法正常工作
- javascript - vanilla js在复选框上隐藏行表
- redirect - 如何在任何查询中使用 haproxy 进行重定向?