C++中使用sort自定义函数
·
在C++中,使用std::sort自定义排序函数时,可以通过传递比较函数或函数对象来控制元素的排序规则。以下是具体实现方法:
自定义比较函数
定义一个返回布尔值的函数,用于比较两个元素。当返回true时,第一个参数应排在第二个参数之前。
bool customCompare(int a, int b) {
return a > b; // 降序排列
}
// 使用示例
std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), customCompare);
Lambda表达式
直接传递Lambda表达式作为比较函数,适合简单逻辑。
std::vector<int> vec = {3, 1, 4, 1, 5};
std::sort(vec.begin(), vec.end(), [](int a, int b) {
return a < b; // 升序排列
});
函数对象(Functor)
通过重载operator()的类实现,适用于需要状态的比较逻辑。
struct CustomComparator {
bool operator()(int a, int b) const {
return a % 2 > b % 2; // 奇数在前,偶数在后
}
};
// 使用示例
std::vector<int> vec = {3, 1, 4, 2, 5};
std::sort(vec.begin(), vec.end(), CustomComparator());
注意事项
- 严格弱序:比较函数必须满足严格弱序规则,即:
- 不可反自反:
comp(a, a)必须为false。 - 可传递性:若
comp(a, b)和comp(b, c)为true,则comp(a, c)必须为true。 - 对称性:若
comp(a, b)为true,则comp(b, a)必须为false。
- 不可反自反:
- 性能:Lambda和函数对象通常比普通函数更高效,因编译器可能内联优化。
示例:结构体排序
对自定义类型的排序需明确比较规则。
struct Person {
std::string name;
int age;
};
// 按年龄升序
std::vector<Person> people = {{"Alice", 25}, {"Bob", 20}};
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
return a.age < b.age;
});
更多推荐


所有评论(0)