矢量迭代器不是dereferencable。对的优先级队列。

时间:2014-05-24 19:14:52

标签: c++ vector iterator priority-queue dereference

所以我有这个代码,在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;
}
}

我不知道发生了什么事,所以如果有人能够至少试着向我解释一下,我会很感激。

1 个答案:

答案 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 >>行出现故障也会中止(如果有的话,算法将会运行)在输入失败后输入所有零项。)

如果在添加这些检查后仍然遇到问题,请将更新的代码(包括检查)与产生问题的输入一起发布。