C++ 向量迭代器不可解引用。对的优先级队列。

C++ 向量迭代器不可解引用。对的优先级队列。,c++,vector,iterator,priority-queue,dereference,C++,Vector,Iterator,Priority Queue,Dereference,因此,我有这段代码,在visual studio上运行后,我得到断言错误: “…程序文件\microsoft visual studio\vc\include\vector 电话号码:70 表达式:向量迭代器不可解引用“ #包括 #包括 #包括 #包括 使用名称空间std; #定义N 100003 配对标签[N]; int a,b,x; int-odp[N]; 内部主(空) { 优先级队列Q; cin>>a; 对于(inti=1;i>tab[i]。第一个>>tab[i]。第二个; Q.推(表[i

因此,我有这段代码,在visual studio上运行后,我得到断言错误: “…程序文件\microsoft visual studio\vc\include\vector 电话号码:70 表达式:向量迭代器不可解引用“

#包括
#包括
#包括
#包括
使用名称空间std;
#定义N 100003
配对标签[N];
int a,b,x;
int-odp[N];
内部主(空)
{
优先级队列Q;
cin>>a;
对于(inti=1;i>tab[i]。第一个>>tab[i]。第二个;
Q.推(表[i]);
}
b=Q.top().秒;
x=0;
Q.pop();

对于(int i=0;i取决于输入,当队列为空时,可以调用
Q.top()
,这会导致未定义的行为(可能是错误的原因)

在初始循环中,您将
a
项推入队列。但随后您将
pop
一项,并循环
a
次。如果所有第一次
a-1
迭代都弹出,则最后一次迭代将检查空队列

例如,输入
12
。即队列从1项开始,然后弹出,然后第二个循环的第一次(也是唯一一次)迭代检查空队列的
top()

要避免此崩溃,可以插入第二个循环的第一行:

if ( Q.empty() )
{
    std::cerr << "Fail - queue is empty\n";
    return 1;
}
if(Q.empty())
{

是的,哪一行是70就好了。总的来说,你似乎在用int和迭代器玩得很快很松散,这不是一回事。你的if/else可能有一个fal-thru条件,这就是你想要的吗?第70行在
标题中,而不是在他的代码中。@user3672299:更相关的问题是,y中的哪一行我们的代码调用的函数未能通过断言。在使用
i
@user3672299对
tab
进行索引之前,您应该检查
a
。您可以给出一组导致问题的输入吗?(最好是您能找到的最小输入集)另外,
if(Q.top().first==tab[j]。first)if(Q.top().second==tab[j]。second)
可以替换为
if(Q.top()==tab[j])
if ( Q.empty() )
{
    std::cerr << "Fail - queue is empty\n";
    return 1;
}