我正在解决这个基于质数生成的简单问题。在Xcode中它运行成功。但是当我把解决方案提交给SPOJ时,它说runtime error SIGSEGV
。我在互联网上搜索了这个运行时错误,当我检查我的解决方案时,我没有看到任何问题。所以如果有任何问题在我的代码是什么,它是如何解决的?
#include <iostream>
#include <list>
using std::cout;
using std::cin;
using std::endl;
int main() {
int tcases = 0;
cin >> tcases;
const int ccase = tcases;
tcases = 0;
while (tcases != ccase) {
int m = 0, n = 0;
cin >> m >> n;
std::list<int> p;
int i = 0;
if (m == 1) i = ++m;
if (m > 1) i = m;
for (; i <= n; p.push_back(i), ++i);
// get all the elements
for (auto first = p.begin(), last = p.end(); first != last; ++first) {
if (*first == 2) continue;
else if (*first == 3) continue;
else if (*first == 5) continue;
else if (*first == 7) continue;
else if (*first % 2 == 0) p.erase(first);
else if (*first % 3 == 0) p.erase(first);
else if (*first % 5 == 0) p.erase(first);
else if (*first % 7 == 0) p.erase(first);
}
for (auto &elem: p)
cout << elem << endl;
cout << endl;
++tcases;
}
return 0;
}
问题是当你说
p.erase(first);
Erase删除当前元素并返回列表中下一个元素的迭代器,该元素没有存储在代码中的任何地方。你在for循环中增加first
,所以当下一次循环运行时,first is not pointing to a valid location and hence the runtime error.
将for loop
更改为以下
for (auto first = p.begin(), last = p.end(); first != last;) {
if (*first == 2)
{
first++;
continue;
}
else if (*first == 3)
{
first++;
continue;
}
else if (*first == 5)
{
first++;
continue;
}
else if (*first == 7)
{
first++;
continue;
}
else if (*first % 2 == 0)
first = p.erase(first);
else if (*first % 3 == 0)
first = p.erase(first);
else if (*first % 5 == 0)
first = p.erase(first);
else if (*first % 7 == 0)
first = p.erase(first);
else
first++;
}
注::共享代码只是为了展示如何使用erase。