我正在尝试解决此问题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.
我的代码中有什么问题?
答案 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]。