无法在我的代码中找到错误:C ++

时间:2016-09-23 14:45:41

标签: c++

我正在尝试解决此问题problem。我写了这段代码:

#include <iostream>
#include <vector>
using namespace std;

int findIndex(x, lastAns, N) {
    return ((x == !lastAns) % N);
}

void query_1(int x, int y, int N, int lastAns, std::vector< std::vector<int> >& v) {

    v[findIndex(x, lastAns, N)].push_back(y);

}

void query_2(int x, int y, int N, int* lastAns, std::vector< std::vector<int> >& v) {

    *lastAns = y % (v[findIndex(x, *lastAns, N)].size());
    cout << *lastAns << endl;

}

int main(int argc, char const *argv[])
{

    int N, Q;
    cin >> N >> Q;

    std::vector< std::vector<int> > v;
    std::vector<int> buff;
    int queryType;
    int lastAns = 0;
    int x, y;

    for(int i=0; i<N; ++i) {
        for(int j=0; j<N-1; ++i) {
            buff.push_back(0);
        }

        v.push_back(buff);

    }

    for(int i=0; i<Q; ++i) {
        cin >> queryType;
        cin >> x >> y;

        if(queryType == 1) {
            query_1(x, y, N, lastAns, v);
        } 

        else if (queryType == 2) {
            query_2(x, y, N, &lastAns, v);
        } 

        else continue;
    }

    return 0;
}

我得到的错误是:

  

在抛出'std :: bad_alloc'实例后终止调用   what():std :: bad_alloc

之前我没有遇到过这个错误。当我通过gdb运行代码时,我得到了这个:

Program received signal SIGABRT, Aborted.
0x00007ffff74ab418 in __GI_raise (sig=sig@entry=6)
    at ../sysdeps/unix/sysv/linux/raise.c:54
54  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

我的代码中有什么问题?

2 个答案:

答案 0 :(得分:3)

注意:

   for(int i=0; i<N; ++i) {
        for(int j=0; j<N-1; ++i)  // <<<<<< some little mouse got here

编辑:

说明: 您创建了无限循环,其中j<N-1始终为true。这意味着,您将新元素推送到向量中,直到没有更多可用内存,因此运行时错误。

答案 1 :(得分:0)

此功能可能是错误原因:

int findIndex(x, lastAns, N) {
    return ((x == !lastAns) % N);
}

首先,参数缺少其类型。

接下来,表达式

!lastAns

将评估为零或非零。 这意味着您要将整数x与零或非零进行比较: (x == 0) or (x == 1)
上述表达式的结果为零或非零。我们假设1为非零。你得到了最后的表达

`return 0 % N;` or `return 1 % N`;

最终返回值为0或1. N变量无关紧要,因为唯一有效值为0或1.您不能将N设为零(您不检查),当N为1时,你仍然得到0或1。

所以你的表达:

v[findIndex(x, lastAns, N)]

将是v[0]或`v [1]。