【发布时间】:2015-08-11 05:01:27
【问题描述】:
我解决了 Hacker Rank 中的一个问题。
输入格式。输入的第一行包含一个整数 N。下一行包含 N 个空格分隔的整数。第三行包含一个整数 x,表示应被从向量中删除。第四行包含两个整数 a 和 b,表示应该从包含 a 和不包含 b 的向量中删除的范围。
输出格式。在第一行打印向量的大小,在第二行打印两次擦除操作后的向量元素,以空格分隔。
代码:
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
int n = 0, x = 0, value = 0;
vector<int> vk, vm;
vk.reserve(100000);
string k, m;
cin >> n;
cin.ignore();
getline(cin, k);
cin >> x;
cin.ignore();
getline(cin, m);
stringstream sk(k);
while (sk >> value)
vk.push_back(value);
stringstream sm(m);
while (sm >> value)
vm.push_back(value);
vk.erase(vk.begin() + x-1);
vk.erase(vk.begin() + vm[0]-1, vk.begin() + vm[1]-1);
cout << vk.size() << endl;
for (int i = 0; i < vk.size(); i++)
cout << vk[i] << " ";
cout << endl;
return 0;
}
但是用这个测试用例会产生一个“分段错误”:
6
1 4 6 2 8 9
2
2 4
您能帮我检查一下我的代码并就问题所在提供一些反馈吗?
编辑
感谢@john 的回答。以下是没有 seg 错误时的样子:
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main() {
int n = 0, x = 0, y = 0, z = 0, value = 0;
vector<int> vk;
vk.reserve(100000);
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> value;
vk.push_back(value);
}
cin >> x >> y >> z;
vk.erase(vk.begin() + x-1);
vk.erase(vk.begin() + y-1, vk.begin() + z-1);
cout << vk.size() << endl;
for (int i = 0; i < vk.size(); i++)
cout << vk[i] << " ";
cout << endl;
return 0;
}
【问题讨论】:
-
对不起,我没看到,这是建议的,只能点击它。已删除。
-
它对我来说适用于同一个测试用例。
-
是的,在我的笔记本电脑上也适用于我,但在黑客等级网站上显示 seg 错误。一开始这很奇怪,但现在@john 提供的答案很清楚是什么错误。
标签: c++ vector segmentation-fault