如果用:priority_queue < pair <int,int> > pq;

学术版

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


|