在我的代码中找不到错误:c++

Cant find error in my code : C++

本文关键字:错误 c++ 找不到 我的 代码      更新时间:2023-10-16

我正在尝试解决这个问题。我写了下面的代码:

#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'实例后终止调用
(): 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.

我的代码有什么问题?

备注:

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

解释:你创造了一个无限循环,其中j<N-1总是true。这意味着,您将新元素压入vector,直到没有可用的内存为止,因此会出现运行时错误。

这个函数可能是导致错误的原因:

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].