C++ sort函数中compare比较器内部工作原理及疑问解答
关于C++ sort自定义比较函数的疑问解答
先贴出你提供的代码:
#include <iostream> #include<bits/stdc++.h> using namespace std; bool compare (int a, int b) { return a>b; } int main() { int arr[5]= {1,2,5,9,6}; sort (arr,arr+5, compare); for (auto i: arr) cout << i << " "; return 0; }
疑问1:调用sort时为何compare后不加(),与普通函数调用方式不同?
这里传递的是函数指针,不是调用函数。sort的第三个参数需要的是一个「可调用对象」(比如函数指针、lambda、仿函数),用来指定排序规则。如果加了(),就会直接执行compare函数并返回一个bool值,这不符合sort对参数的类型要求——它需要的是能接收两个int参数、返回bool的函数的地址,而非一个现成的bool结果。
疑问2:未手动传递参数,compare函数如何获取参数值?
参数是由sort函数内部自动传递的。sort在执行排序逻辑时(比如遍历元素、判断交换时机的过程中),会不断取出数组中的两个元素,作为参数传给你定义的compare函数,以此判断两者的相对顺序是否符合规则。你只需要定义好比较逻辑,具体的调用时机和参数传递都由sort的内部实现完成。
疑问3:返回true和false为何能实现数组的降序排序?
sort的核心规则是:如果compare(a, b)返回true,就会把a放在b的前面;如果返回false,则调整两者位置(或保持原位置,取决于具体排序算法)。
你的compare函数返回a > b,意思是「当a比b大时,a应该排在b前面」。sort会根据这个规则,把更大的元素逐步往前调整,最终整个数组就变成了降序排列。如果用默认的升序排序(不写第三个参数),等价于使用less<int>(),也就是判断a < b为true时a在前,正好和你的规则相反。
内容的提问来源于stack exchange,提问作者Shroud
相关产品推荐
相关产品推荐

