pair比较方法的定义基本如下
```
template < typename data_1,typename data_2 >
bool
pair < data_1,data_2 > :: operator<(const pair& a){
return first!=a.first?first<a.first:second<a.second;
}
```
因此
```
#include<cstdio>
#include<queue>
using std::priority_queue;
using std::pair;
priority_queue < pair < int,int > >pq;
int main(){
pq.push(pair<int,int>(1,4));
pq.push(pair<int,int>(4,4));
pq.push(pair<int,int>(4,5));
printf("%d %d",pq.top().first,pq.top().second);
return 0;
}
```
输出
```
4 5
```
by 密期望 @ 2018-05-13 11:40:24
明白了,也就是说是先比较frist,再比较second。
非常感谢
by jtzhang @ 2018-05-13 12:09:47
@[密期望](/space/show?uid=81705) 不全对。`operator<`应显式指明`this`不能修改:
MinGW 4.8.1实现如下(于stl_pair.h中,pair中一堆C++11版的SFINAE写的臃肿的半死(14会稍微好一点,毕竟有`alias template`),所以我找了半天……)而且GNU的小于运算符是*non-member function*
```cpp
template<class _T1, class _T2>
inline _GLIBCXX_CONSTEXPR bool
operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
{ return __x.first < __y.first
|| (!(__y.first < __x.first) && __x.second < __y.second); }
```
翻译成人话就是:
```cpp
//-std=c++11
template<typename T1,typename T2>
inline constexpr bool operator<(const pair<T1,T2>& lhs,const pair<T1,T2>& rhs)
{
return lhs.first<rhs.first||(!(rhs.first<lhs.first)&&lhs.second<rhs.second);
}
```
我已经尽量人话了。
再翻译成老式C++的话:
```cpp
template<typename T1,typename T2>
inline const bool operator<(const pair<T1,T2>& lhs,const pair<T1,T2>& rhs)const
{
return lhs.first<rhs.first||(!(rhs.first<lhs.first)&&lhs.second<rhs.second);
}
```
本con已经尽力了,看不看得懂是你们的事情了……
by constructor @ 2018-05-15 16:32:32
```cpp
const bool```
这里`const`去掉。
所以虽然事实上和`constexpr`不完全一样,但也符合规范了。
by constructor @ 2018-05-15 16:34:38
@[constructor](/space/show?uid=56461) 感谢大佬指正,我这用写的确是有问题的,参数的泛型也没有实例化,当时写的太急,疏忽了。
by 密期望 @ 2018-05-23 21:32:47