c++中sort函数cmp的写法
时间: 2024-10-22 10:26:17 浏览: 216
在C++标准库中的`std::sort`函数是用来对容器中的元素进行排序的,它通常接受一个比较函数作为第三个参数,这个函数被称为`comparison function`或`cmp`。这个函数负责定义元素间的比较规则,决定哪些元素应该排在前面。
`cmp`的典型写法是一个接受两个参数(通常是容器中的元素类型)并返回一个整数类型的函数。如果第一个参数应当排在第二个之前,函数应返回负数;若两个相等,返回0;如果第一个应在后面,返回正数。例如,对于自增顺序,可以这样编写:
```cpp
bool compare(int a, int b) {
return a < b; // 升序排列
}
// 或者如果是降序排列
bool compareDesc(int a, int b) {
return a > b;
}
void sortArray(std::vector<int>& arr) {
std::sort(arr.begin(), arr.end(), compare); // 升序排序
// 或者
std::sort(arr.begin(), arr.end(), compareDesc); // 降序排序
}
```
相关问题
c++中sort函数用法cmp函数写法
### C++ 中 `std::sort` 函数及其自定义比较函数
在 C++ 的标准模板库 (STL) 中,`std::sort` 是一种高效的排序算法实现。此函数位于 `<algorithm>` 头文件内[^1]。
#### 使用默认升序排列整数数组
当不提供额外参数时,默认按照从小到大顺序对元素进行排序:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main(){
std::vector<int> vec = {5, 3, 7, 9, 1};
std::sort(vec.begin(), vec.end());
for(auto& v : vec){
std::cout << v << " ";
}
}
```
对于结构体类型的容器,则需指定一个二元谓词作为第三个参数来告知编译器如何判断两个对象之间的大小关系。
#### 定义并应用自定义比较函数
假设有一个包含姓名和 ID 号码字段的学生类 `Student`:
```cpp
struct Student {
std::string name;
int id;
bool operator<(const Student &other)const{
return this->id < other.id; // 默认按ID号升序排列
}
};
// 自定义比较函数用于降序排列学生记录依据其学籍编号
bool compareByIdDesc(const Student &lhs,const Student &rhs){
return lhs.id > rhs.id ;
}
void sortStudents(std::vector<Student>& students,bool (*compare)(const Student&, const Student&) ){
std::sort(students.begin(),students.end(),compare);
}
```
上述代码展示了两种方式来自定义比较逻辑:重载小于运算符 (`operator<`) 和创建独立的布尔返回值型辅助函数 `compareByIdDesc()` 。这两种方法都可以传递给 `std::sort` 来改变排序行为。
为了更贴近给出的例子,在处理哈希表中的数据时可以这样做:
```cpp
typedef struct my_struct {
char* name;
int id;
} MY_STRUCT;
// 比较名字字符串
bool cmpByName(MY_STRUCT a,MY_STRUCT b){
return strcmp(a.name,b.name)<0;
}
// 对my_struct类型的数据集执行基于名称字母序的排序操作
void sortByMyStructName(std::vector<MY_STRUCT>& dataVec){
std::sort(dataVec.begin(),dataVec.end(),cmpByName);
}
```
sort函数定义cmp和优先队列自定义排序
### 如何在 `sort` 函数中使用 `cmp` 参数实现自定义排序
在 C++ 中,标准库中的 `std::sort` 可以接受一个可选的第三个参数作为比较器(即 `cmp`),用于指定自定义的排序逻辑。这个比较器是一个二元谓词,返回布尔值,决定两个元素之间的顺序。
以下是具体实现方法:
#### 自定义比较函数
可以定义一个普通的函数来充当比较器:
```cpp
bool compare(int a, int b) {
return a < b; // 升序排列
}
```
调用 `std::sort` 时传递该函数名即可:
```cpp
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 8, 6};
std::sort(vec.begin(), vec.end(), compare);
return 0;
}
```
如果希望降序排列,则修改比较器逻辑为 `return a > b;`[^1]。
---
#### 使用 Lambda 表达式
Lambda 表达式提供了一种更简洁的方式定义比较器:
```cpp
#include <algorithm>
#include <vector>
int main() {
std::vector<int> vec = {5, 3, 8, 6};
std::sort(vec.begin(), vec.end(), [](const int& a, const int& b) -> bool {
return a > b; // 降序排列
});
return 0;
}
```
上述代码通过匿名函数实现了降序排序[^2]。
---
### 优先队列(`priority_queue`)的自定义排序方式
对于 `std::priority_queue`,可以通过模板参数指定自定义比较器。默认情况下,`std::priority_queue` 是最大堆(按降序排列)。要改变这种行为,需传入自定义比较器。
#### 定义结构体并重载 `<` 运算符
假设有一个名为 `Node` 的结构体,可以通过重载小于运算符 (`<`) 来实现自定义排序:
```cpp
struct Node {
int value;
bool operator<(const Node& other) const {
return value > other.value; // 小顶堆
}
};
// 创建小顶堆
std::priority_queue<Node, std::vector<Node>, std::greater<Node>> pq;
```
此处利用了 STL 提供的标准比较器 `std::greater<T>` 实现升序的小顶堆。
---
#### 使用函数对象或 Lambda 表达式
也可以直接定义一个函数对象或者使用 Lambda 表达式完成相同功能:
```cpp
struct CompareNodes {
bool operator()(const Node& lhs, const Node& rhs) const {
return lhs.value > rhs.value; // 小顶堆
}
};
// 使用自定义比较器创建优先队列
std::priority_queue<Node, std::vector<Node>, CompareNodes> pq;
```
或者采用 Lambda 表达式的写法:
```cpp
auto cmp = [](const Node& lhs, const Node& rhs) -> bool {
return lhs.value > rhs.value; // 小顶堆
};
std::priority_queue<Node, std::vector<Node>, decltype(cmp)> pq(cmp);
```
这种方式更加灵活,适合复杂场景下的定制化需求。
---
### 总结
无论是 `std::sort` 还是 `std::priority_queue`,都可以通过自定义比较器实现特定的排序规则。前者支持任意范围内的数组或容器排序,而后者则适用于动态维护有序集合的需求。
阅读全文
相关推荐
















