自定义的sort, stable_sort,map,set,priority_queue等都需要传入自定义的比较函数
sort,statble_sort可以需要传入函数指针(函数类型)或仿函数(函数对象)
map,set,priority_queue需要传入仿函数(函数对象)
# sort,statble_sort
首先搞清楚这些函数对什么样的一个结构进行排序。这些函数排序的是一个序列结构,可以理解为将一个序列中一前一后的两个值a和b进行比较,如cmp(a,b),如果cmp返回true,则将前面的前面的值放在前面,后面的值放在后面,也就是不改变顺序;如果cmp返回false,则将前面的前面的值放在后面,后面的值放在前面,也就是互换a和b
所以排序方式是,返回true,前面的放前面,返回false,后面的放前面。
# map,set,priority_queue
这些函数排序的是一个树形结构。其中我们一般不会关注map和set里的排序方式,priority_queue的排序方式影响了他是一个大顶堆还是小顶堆。一般的情况下,priority_queue在进行建堆或者调整堆的时候,都会将父节点和其中一个子节点进行比较。如果用小于号比较,即查看父节点<子节点的返回值,这是构建大顶堆才会去做的操作,(即大顶堆的调整过程为,在两个子节点中去一个较大的子节点,查看父节点<较大的子结点的返回值,如果返回为true,说明应该交换父节点和较大子结点的位置,即后面的值放前面,如果返回为false,说明顺序不变,前面的值反放前面)。
所以排序的方式是 返回true,后面的放前面,返回false,前面的放前面。
这也是在两个地方排序函数使用的判断符号(大于号或者小于号)相同,但是得到的顺序相反的原因。