你应该如何避免C ++中的SIGABRT错误?

时间:2013-11-28 12:30:54

标签: c++ sigabrt

我正在尝试为编程竞赛编写以下程序(已经结束)。但是,我一直收到SIGABRT错误。在运行下一个测试用例之前,我确保清空所有容器。我该怎么检查?

这就是我实现代码的方式: http://discuss.codechef.com/questions/29659/lowsum-editorial

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>

using namespace std;

class compare
{
public:
    bool operator()(int a, int b)
    {
        return a>b;
    }
};

int main()
{
    int T,K,Q;
    vector<int> A,B,q,nsum;
    priority_queue<int, vector<int> , compare> PQ;      //min PQ
    scanf("%d",&T);

while(T--)
{
    scanf("%d %d",&K,&Q);

    A.resize(K);
    B.resize(K);
    q.resize(Q);

    for(int i= 0;i<K;++i)
        scanf("%d",&A[i]);

    for(int i=0;i<K;++i)
        scanf("%d",&B[i]);

    int max_q=0;

    for(int i=0;i<Q;++i)
    {
       scanf("%d",&q[i]);
       if(q[i]>max_q)
        max_q=q[i];
    }

    sort(A.begin(),A.end());
    sort(B.begin(),B.end());

    while(!PQ.empty())
        PQ.pop();

    int j=0;

    while(max_q > 0 && j < K)
    {
        for(int i=0;i<K;++i)
            PQ.push(A[i]+B[j]);

        max_q--;
        j++;                        //next element of B[]
    }

    while(!PQ.empty())
    {
        nsum.push_back(PQ.top());
        PQ.pop();
    }

    for(int j=0;j<Q;++j)
       printf("%d\n",nsum[q[j]-1]);

    nsum.clear();
}
}

1 个答案:

答案 0 :(得分:0)

我认为你正在记忆中。

首先将数组调整为0。否则,resize应该复制两个数组中常见的内容,因此需要首先分配一个新的entrie数组,复制所有内容,然后释放旧的数组。

对于这些类型的东西,你可以在乞讨时调整向量的大小,以应对可能的最大测试用例,然后再也不要再触摸它们了。