Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 优先级队列大小的意外行为_C++ - Fatal编程技术网

C++ 优先级队列大小的意外行为

C++ 优先级队列大小的意外行为,c++,C++,我正在为这个问题编写代码遇到问题时整数流的中值。请注意,这个问题不是算法问题,而是优先级\u队列大小的模糊行为 #include <bits/stdc++.h> using namespace std; priority_queue<double> small; priority_queue<double, vector<double>, greater<double> > large; void rebalance() { c

我正在为这个问题编写代码遇到问题时整数流的中值。请注意,这个问题不是算法问题,而是
优先级\u队列
大小的模糊行为

#include <bits/stdc++.h>
using namespace std;
priority_queue<double> small;
priority_queue<double, vector<double>, greater<double> > large;
void rebalance()
{
    cout << "Initial size\n";
    cout << "small " << small.size() << " large " << large.size() << endl;
    if (small.size() - large.size()>1)
    {
        large.push(small.top());
        small.pop();
    }
    else if (large.size() - small.size()>1)
    {
        cout << "Unexpectedly goes here\n";
        cout << "garbage size difference " << large.size() - small.size() << endl;
        small.push(large.top());
        large.pop();
    }
}
void addNum(int num) {
    if (small.size() == 0 || num<small.top())
    {
        small.push(num);
    }
    else
    {
        large.push(num);
    }
    rebalance();
}

double findMedian() {
    if (small.size() == large.size())
    {
        double ans = (small.top() + large.top()) / 2.0;
        return ans;
    }
    else if (small.size()>large.size())
    {
        return (double)small.top();
    }
    else
    {
        return (double)large.top();
    }
}
int main()
{
    std::ios_base::sync_with_stdio(false);
    int num = 5;
    addNum(num);
    cout << findMedian() << endl;
    return 0;
}
重新平衡
函数中,
small
的初始大小为
1
,large的初始大小为
0
,这表明循环既不应进入if条件也不应进入else if条件,但循环进入的else if条件的大小为垃圾值。为什么会发生这种情况?此外,我还尝试将大小保存在一个整数变量中,然后在条件中比较它们,这会导致代码被接受。因此,该算法处理正确性

是什么导致了这个垃圾值

else if(large.size()-small.size()>1)
size()
返回一个无符号数字。一个无符号的数字永远不可能是负数,所以如果它是负数,它会绕到它可能是的最大值,然后从那里向后走。由于
large
的大小为
0
small
的大小为
1
,因此
0-1
为您提供
18446744073709551615
。我相信你想做的应该表达为

if(small.size() < large.size())
{
    small.push(large.top());
    large.pop():
} 
else if(large.size() < small.size())
{
    large.push(small.top());
    small.pop();
}
if(small.size()
中的

size()
返回一个无符号数字。一个无符号的数字永远不可能是负数,所以如果它是负数,它会绕到它可能是的最大值,然后从那里向后走。由于
large
的大小为
0
small
的大小为
1
,因此
0-1
为您提供
18446744073709551615
。我相信你想做的应该表达为

if(small.size() < large.size())
{
    small.push(large.top());
    large.pop():
} 
else if(large.size() < small.size())
{
    large.push(small.top());
    small.pop();
}
if(small.size()
单独使用,是不好的做法。它们一起放大了彼此最严重的不良影响。要非常小心。如果你开始遇到疯狂的神秘错误,你应该做的第一件事就是删除这两行。@user4581301为什么会这样?有竞争力的程序员已经使用这两行代码来减少很多样板库,标准库中有成千上万的标识符。远远超过任何程序的需要。包括整个标准库会将它们全部带到您的程序中,它们可能与您定义的标识符冲突。幸运的是,它们位于
std
名称空间中,需要范围解析。然后出现了
使用namespace std
来删除该保护。你愿意花多少时间来弄清楚为什么编译器告诉你你的多项式函数
laguerre
是不明确的?小心。分开和分开是不好的做法。它们一起放大了彼此最严重的不良影响。要非常小心。如果你开始遇到疯狂的神秘错误,你应该做的第一件事就是删除这两行。@user4581301为什么会这样?有竞争力的程序员已经使用这两行代码来减少很多样板库,标准库中有成千上万的标识符。远远超过任何程序的需要。包括整个标准库会将它们全部带到您的程序中,它们可能与您定义的标识符冲突。幸运的是,它们位于
std
名称空间中,需要范围解析。然后出现了
使用namespace std
来删除该保护。你愿意花多少时间来弄清楚为什么编译器告诉你你的多项式函数
laguerre
是不明确的?小心点。我理解你的解释,但你建议的更改不会导致正确的解决方案,我想,因为对于第一个元素,按下small.size()>large.size(),因此代码进入else if,并从large弹出,它是空的,因此产生Seg fault。我们只需要在大小之间的差异超过一个时进行重新平衡,所以我猜存储在变量中可能是一种简单的方法,可以传递所有情况。不过,我对尺寸()的行为感到非常有趣。Thanks@falcon我已经修改了密码。我认为这更接近您想要的。对于一个测试用例仍然失败:(.我们只需要在size_diff>=2时进行平衡。因此,我在两个条件中都使用了a.size-abs(b.size())>1,因此它通过了。我理解您的解释,但您建议的更改不会导致正确的解决方案,因为对于第一个推小的元素。size()>large.size()因此,如果代码进入else if并从large弹出,它是空的,因此产生Seg fault。我们只需要在大小之间的差异超过一个时重新平衡,所以我猜存储在变量中可能是一种简单的方法,可以通过所有情况。size()的行为让我很开心不过。Thanks@falcon我已经修改了代码。我认为这更接近您想要的。测试用例仍然失败:(.我们只需要在size_diff>=2时进行平衡。因此我在两个条件中都使用了a.size-abs(b.size())>1,因此它通过了。