sort 与自定义比较

默认升序、cmp 函数、lambda——让任意类型按你的规则排序。

CSP-JCSP-S

◎学完你会

1动一动:结构体多关键字排序

struct Stu{int score; string name;}; bool cmp(Stu a, Stu b){ return a.score > b.score; // 分数降序 } sort(v.begin(), v.end(), cmp); // 或 lambda: sort(v.begin(), v.end(), [](Stu a,Stu b){return a.score>b.score;});
按分数排序前:{85,92,78,99}
默认升序;想降序/按自定义规则就得给 cmp。

2关键命令

写法含义复杂度
sort(a, a+n)排数组(默认升序)O(n log n)
sort(v.begin(), v.end())排 vectorO(n log n)
sort(..., cmp)按 cmp 规则排O(n log n)
sort(..., [](a,b){...})lambda 比较器C++11
cmp 规则:return a.x < b.x = 按 x 升序;return a.x > b.x = 降序。结构体多关键字就并列条件:先按分数,再按名字。

⚠易错点

cmp 要满足“严格弱序”:对任意 a,b 只可能有 a<b、b<a、等价 三者之一,且传递。别写能“同时返回 true 和 true”的矛盾比较(如 return a<b || a>b)。
相等时返回 false:cmp 里 a==b 时必须返回 false,不能 true——否则破坏严格弱序,sort 行为未定义。

?跨学科:sort 像“按规则排队分拣”

默认排队按身高升序;但你要按成绩排、再按名字排,就得告诉“分拣员”自定义规则(cmp)。它不必知道人长什么样,只要明白“谁排在谁前面”的判定。

“只给规则、不关心细节”是通用抽象:sort 只要一个能回答“a 该在 b 前吗?”的函数,怎么排交给它。

✎练一练

数组 a={3,1,2},sort(a,a+3) 后是?
默认 sort 是升序:< 比较,{3,1,2} 变 {1,2,3}。要降序就传 cmp return a>b。
比较函数里两元素相等时,应返回?
答案:返回 false。a==b 时既不能 a 在前也不能 b 在前,必须 false 才能满足严格弱序,否则 sort 行为未定义。