所以我有这个代码,在visual studio上运行之后我得到了断言错误: “...程序文件\ microsoft visual studio \ vc \ include \ vector 行:70 表达式:矢量迭代器不能解除引用“
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define N 100003
pair<int, int> tab[N];
int a, b, x;
int odp[N];
int main(void)
{
priority_queue<pair<int, int>, vector<pair<int, int>>, less<pair<int, int>> > Q;
cin>>a;
for(int i=1; i<=a; i++)
{
cin>>tab[i].first>>tab[i].second;
Q.push(tab[i]);
}
b=Q.top().second;
x=0;
Q.pop();
for(int i=0; i<a; i++)
{
if(Q.top().second<b)
{
b=Q.top().second;
Q.pop();
}
else if(Q.top().second>b)
{
x++;
for(int j=1; j<=a; j++)
{
if(Q.top().first==tab[j].first)
{
if(Q.top().second==tab[j].second)
{
odp[x]=j;
}
}
}
Q.pop();
}
}
cout<<x<<endl;
for(int i=1; i<=x; i++)
{
cout<<odp[i]<<endl;
}
}
我不知道发生了什么事,所以如果有人能够至少试着向我解释一下,我会很感激。
答案 0 :(得分:0)
根据输入,当队列为空时可以调用Q.top()
,这会导致未定义的行为(可能是导致错误的原因)。
在初始循环中,您将a
项目推入队列。但是你pop
一个项目,然后循环a
次。如果弹出所有第一次a-1
次迭代,则最后一次迭代将检查空队列。
有关此示例,请输入1 1 2
。即队列以1项开始,然后弹出,然后第二次循环的第一次(也是唯一的)迭代检查空队列的top()
。
为避免此次崩溃,您可以插入第二个循环的第一行:
if ( Q.empty() )
{
std::cerr << "Fail - queue is empty\n";
return 1;
}
(或抛出并捕捉异常等)
然而,或许这表明你的算法存在逻辑错误(我没有试图弄清楚整个事情)。
请注意,您还应该在a < N
之后检查cin>>a;
,如果另一条cin >>
行出现故障也会中止(如果有的话,算法将会运行)在输入失败后输入所有零项。)
如果在添加这些检查后仍然遇到问题,请将更新的代码(包括检查)与产生问题的输入一起发布。