当前位置: 首页 > 知识库问答 >
问题:

排序函数和优先级队列c中的比较器

钱繁
2023-03-14

在C Sort函数中,第三个可选参数是用于对对象进行排序的比较器。如果我们传入的比较器更少,我们将以递增的顺序获得对象。(如果比较器的评估结果为真,则不会更改位置,否则将对元素进行交换!)我的理解正确吗?

按照同样的方式,如果我们将一个较少的比较器传递给优先级队列,我们应该得到一个最小堆(如果基础数据结构被选择为向量,对象将按递增顺序排序)。如果我们调用top(),将返回向量的第一个元素,这是最小的数字。因此,我认为它是一个min堆)为什么我们得到一个max堆?

共有1个答案

时旭东
2023-03-14

根据这篇在线文档,C库类std::priority_queue首先返回最大的元素,即比较器先排序较小的元素,再排序较大的元素。从以上链接:

请注意,定义Compare参数时,如果其第一个参数在弱顺序中位于第二个参数之前,则返回true。但是,由于优先级队列首先输出最大的元素,“在前面”的元素实际上是最后输出的。也就是说,队列的前端包含“last”元素,这是根据Compare所施加的弱顺序确定的。

因此std::priority_queue

 类似资料:
  • 我刚开始学习C语言,有一半的时间我不知道自己在做什么,花了好几个小时在谷歌上搜索,盲目地在我的项目中输入代码,这可能是一个基本的问题,但我似乎不能正确地理解它。 这是我作业的要求,我需要这些: 在“边”类中: 在Graph类中: 我在声明优先级队列时遇到问题。细节: 如果我直接使用这些,edge类会给我一个错误“必须有类的参数”,我知道我不能将两个指针重载到bool运算符中,所以我尝试了以下方法:

  • 假设我实现了一个HashMap,其中字符被分配了一个值的ArrayList。 我已经在HashMap中创建了这些字符的PriorityQueue,但我希望能够根据此优先级删除这些字符: {a,b,c} {a,b}删除c,因为它的ArrayList中包含一个值,该值决定必须首先删除它。 对此最好的方法是什么?

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。

  • 如果我有一个PriorityQueue,它有一个Comparator,一个element类实现了Comparable类,以及它们的排序冲突,那么队列将如何处理排序?它是抛出异常还是忽略一个排序规则?

  • 有人能解释一下这里使用的比较运算符的语法吗?它是做什么的