C++ priority_queue自定义比较器排序异常原因咨询
问题原因分析
- 你的第二个自定义比较器存在未定义行为,这是输出异常的核心原因:
C++标准明确要求,返回值类型非void的函数,必须在所有执行路径上都返回对应类型的值,否则属于未定义行为。你写的比较器的operator()只有在a>b的分支下返回了true,当a<=b时函数执行到末尾没有返回任何值,编译器不会默认帮你补return false的逻辑,执行结果完全不可预测。 - 标准库的
priority_queue要求传入的比较器必须满足严格弱序约定,要求比较器的返回值是确定的二值布尔结果,而你写的异常比较器返回值是不确定的,会导致优先队列内部建堆、调整堆的逻辑完全混乱,最终输出的顺序也不符合预期,你看到的8 1 5只是未定义行为的随机表现之一,不同编译环境下还可能出现崩溃、乱序、死循环等各种异常结果。
修复方案
只需要补全所有分支的返回值即可,比如和你第一段正常代码一样直接返回表达式结果:
bool operator()(const int &a,const int &b){ return a > b; }
也可以补全else分支,两种写法完全等价:
bool operator()(const int &a,const int &b){ if(a>b) return true; return false; }
内容的提问来源于stack exchange,提问作者eternityparadigm
相关产品推荐
相关产品推荐

