C++优先队列大小差值返回超大值问题求助
问题原因与解决方案
问题本质
C++标准容器(包括priority_queue)的size()方法返回的是无符号整数类型(通常是size_t)。当直接对两个无符号整数做减法时,运算会遵循无符号数规则——不会产生负数,而是发生溢出回绕。
你的代码中:
spq.size()的值是1(无符号)lpq.size()的值是2(无符号)- 计算
1 - 2时,无符号数减法会把结果转换为该类型的最大值,也就是64位size_t对应的18446744073709551615。
解决方案
要得到正确的负数结果,需要将其中一个操作数强制转换为有符号整数类型,让运算按照有符号规则执行:
方法1:强制转换其中一个值
cout << static_cast<long long>(spq.size()) - lpq.size() << endl;
方法2:先存入有符号变量再计算
long long spq_size = spq.size(); long long lpq_size = lpq.size(); cout << spq_size - lpq_size << endl;
注意事项
所有C++标准容器的size()、capacity()等方法都返回无符号类型,目的是和容器的索引类型保持一致。但在进行算术运算时,若可能出现负数结果,一定要显式转换为有符号类型,避免无符号溢出导致的异常值。
内容的提问来源于stack exchange,提问作者Bhawan
相关产品推荐
相关产品推荐

