greater<int>()和less<int>()的使用

本文详细介绍了C++标准库中的greater和less结构,这两种结构用于实现比较操作,并通过示例展示了如何在sort()函数中使用greater&lt;int&gt;()和less&lt;int&gt;()来对整数数组进行升序和降序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/chijianxingfeng/article/details/8886399


greater和less

greater和less是头文件<xfunctional>中定义的两个结构。下面看它们 的定义,greater和less都重载了操作符()。

[cpp]  view plain  copy
  1.     // TEMPLATE STRUCT greater  
  2. emplate<class _Ty>  
  3. struct greater  
  4.     : public binary_function<_Ty, _Ty, bool>  
  5. {   // functor for operator>  
  6. bool operator()(const _Ty& _Left, const _Ty& _Right) const  
  7.     {   // apply operator> to operands  
  8.     return (_Left > _Right);  
  9.     }  
  10. };  
  11.   
  12.     // TEMPLATE STRUCT less  
  13. emplate<class _Ty>  
  14. struct less  
  15.     : public binary_function<_Ty, _Ty, bool>  
  16. {   // functor for operator<  
  17. bool operator()(const _Ty& _Left, const _Ty& _Right) const  
  18.     {   // apply operator< to operands  
  19.     return (_Left < _Right);  
  20.     }  
  21. };  

在sort()函数中使用greater<int>()和less<int>(),

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<algorithm>//因为用了sort()函数  
  3. #include<functional>//因为用了greater<int>()  
  4. using namespace std;  
  5.   
  6. void main()  
  7. {  
  8.     int a[]={3,1,4,2,5};  
  9.     int i;  
  10.     int len=sizeof(a)/sizeof(int);//这里切记要除以sizeof(int)!  
  11.   
  12.     sort(a ,a + len, greater<int>());//内置类型的由大到小排序  
  13.     for(i=0;i<len;i++)  
  14.         cout<<a[i]<<" ";  
  15.     cout<<"\n";  
  16.     sort(a, a + len, less<int>());        //内置类型的由小到大排序  
  17.     for(i=0;i<len;i++)  
  18.         cout<<a[i]<<" ";  
  19. }  
<think>在C++ STL中,`greater<int>` 是一个函数对象(仿函数),定义在 `<functional>` 头文件中。它用于执行“大于”比较操作,常用于需要比较的场景(如排序、堆操作)。具体定义如下: ### 定义解析 - **类型**:`greater<int>` 是模板类 `greater<T>` 的一个特化版本(`T = int`)。 - **作用**:重载了 `operator()`,使其行为类似于一个函数,接受两个参数并返回 `(a > b)` 的布尔结果。 - **底层实现**(简化): ```cpp template <class T> struct greater { bool operator()(const T& a, const T& b) const { return a > b; } }; ``` ### 使用场景 1. **`priority_queue` 实现最小堆**: 默认 `priority_queue` 使用 `less<T>`(大顶堆),若需小顶堆,需显式指定比较器为 `greater<T>`: ```cpp priority_queue<int, vector<int>, greater<int>> minHeap; ``` 2. **排序算法**: 在 `sort` 函数中实现降序排序(或与默认升序相反): ```cpp vector<int> vec = {5, 2, 8, 3}; sort(vec.begin(), vec.end(), greater<int>()); // 降序:{8, 5, 3, 2} ``` ### 注意事项 - **头文件**:使用前需包含 `<functional>`。 - **与 `less<T>` 对比**: - `less<T>`:默认比较器,返回 `(a < b)`,用于升序排序或最大堆。 - `greater<T>`:返回 `(a > b)`,用于降序排序或最小堆。 §§相关问题§§ 1. 为什么 `priority_queue` 默认使用 `less<T>` 却实现了最大堆? 2. 除了 `priority_queue`,STL 中还有哪些容器或算法会用到 `greater<T>`? 3. 如何为自定义结构体实现 `greater` 比较器? 4. `greater<T>` `less<T>` 在性能上有差异吗? 5. 在 C++20 中,`greater<T>` 是否有新的替代方式(如三路比较)?</think>在 C++ STL 中,`greater<int>` 是一个**函数对象(仿函数)**,定义在 `<functional>` 头文件中。它用于实现**大于(>)比较操作**,常用于需要反向排序的场景(如最小堆)。以下是详细解析: --- ### 1. **核心定义** ```cpp template <class T> struct greater { bool operator()(const T& a, const T& b) const { return a > b; // 返回 true 当且仅当 a > b } }; ``` - **本质**:是一个模板类(`struct greater`),重载了函数调用运算符 `operator()`。 - **行为**:接受两个参数 `a` `b`,返回 `a > b` 的比较结果。 --- ### 2. **关键用途** #### (1) 实现最小堆(Min-Heap) ```cpp #include <queue> #include <functional> // 使用 greater<int> 作为比较器 priority_queue<int, vector<int>, greater<int>> minHeap; ``` - **原理**:`priority_queue` 默认用 `less<int>`(返回 `a < b`)构建**最大堆**,而 `greater<int>`(返回 `a > b`)会反转比较逻辑,形成**最小堆**。 #### (2) 降序排序 ```cpp #include <algorithm> #include <functional> vector<int> vec = {3, 1, 4, 2}; sort(vec.begin(), vec.end(), greater<int>()); // 结果:{4, 3, 2, 1}(降序) ``` --- ### 3. **底层实现原理** - **编译期多态**:通过模板实例化生成特定类型的比较器。 - **内联优化**:`operator()` 通常被编译器内联,无函数调用开销。 - **与 `less<int>` 对比**: | 比较器 | 表达式 | 堆类型 | 排序方向 | |----------------|----------|----------|------------| | `less<int>` | `a < b` | 最大堆 | 升序(默认)| | `greater<int>` | `a > b` | 最小堆 | 降序 | --- ### 4. **自定义类型扩展** 若元素是自定义结构体,需先重载 `operator>` 或提供自定义比较器: ```cpp struct Person { int age; // 重载 > 运算符 bool operator>(const Person& other) const { return age > other.age; } }; // 使用 greater<Person>(依赖重载的 operator>) priority_queue<Person, vector<Person>, greater<Person>> pq; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值