SPOJ中的运行时错误(SIGSEGV)

时间:2015-07-28 09:21:13

标签: c++

我是根据素数生成解决这个简单的problem。在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;
 }

1 个答案:

答案 0 :(得分: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++;
        }

P.S。 :共享代码只是为了说明如何使用擦除。