c++++的sort函数需配合自定义比较函数实现灵活排序。默认情况下,sort按升序排列元素,如std::sort(nums.begin(), nums.end())可对vector

C++的
sort函数是
库中最常用、最高效的排序工具之一,尤其在处理数组或容器(如
vector)时非常方便。但如果你需要按照特定规则排序,比如降序、结构体字段比较等,就需要配合自定义比较函数一起使用。

下面我们就来看看怎么用
sort和自定义比较函数完成各种排序任务。

一、基本用法:默认升序排序
sort的基本调用方式是传入两个迭代器(起始和结束位置),它默认按升序排列元素:
立即学习“C++免费学习笔记(深入)”;
#include#include std::vector nums = {5, 2, 9, 1, 3}; std::sort(nums.begin(), nums.end());
执行后,
nums会变成
{1, 2, 3, 5, 9}。

这适用于内置类型(如
int、
double)以及重载了
<运算符的类对象。如果你只是排个整数数组,这样就足够用了。
二、如何实现降序排序?
想排成从大到小?可以使用标准库提供的
greater函数对象:
std::sort(nums.begin(), nums.end(), std::greater());
或者你也可以自己写一个比较函数,效果是一样的。
三、自定义比较函数:灵活应对复杂排序逻辑
当你要排序的对象不是简单数字,而是结构体、类对象,或者有多个字段要综合判断时,就需要自己写比较函数。
比较函数格式要求:
比较函数应该接受两个参数,并返回一个布尔值。如果第一个参数应该排在前面,就返回
true。
例如,我们有一个表示学生的结构体:
struct Student {
std::string name;
int score;
};我们希望按分数从高到低排序:
bool compareByScore(const Student& a, const Student& b) {
return a.score > b.score; // 分高的排前面
}然后调用:
std::vectorstudents = {{"Alice", 80}, {"Bob", 95}, {"Charlie", 70}}; std::sort(students.begin(), students.end(), compareByScore);
这样就能得到按成绩降序排列的学生列表。
注意:如果你想先按成绩排,成绩一样再按名字字母顺序排,可以在比较函数里加条件判断:if (a.score != b.score) return a.score > b.score; return a.name
四、使用lambda表达式简化代码
C++11以后支持用lambda来写比较函数,不需要单独声明函数,代码更简洁:
std::sort(students.begin(), students.end(), [](const Student& a, const Student& b) { return a.score > b.score; });这对临时排序很有帮助,尤其是逻辑不复杂的时候。
五、注意事项与常见问题
- 必须保证比较函数满足“严格弱序”,否则可能引起未定义行为。简单来说就是不能出现循环关系,比如A比B小、B比C小、C又比A小。
- 如果排序的是结构体或类,记得传引用,避免拷贝开销。
sort不保证稳定排序,如果需要保持相同元素的原始顺序,要用stable_sort。
基本上就这些内容了。掌握好
sort加上合适的比较函数,不管是排序数字还是结构体,都能轻松应对。关键是理解比较函数的作用机制,以及如何根据需求写出正确的判断逻辑。









