今天leetcode做题被这个坑耗掉了一个下午,怀疑人生了。。。
Leetcode的环境不允许更改Solution类所属名称空间(Solution类估计引入了std中),而很多运算符的重载在std中已经定义过了,而在std名称空间或其子空间中声明或定义内容是无效的。
→
\rightarrow
→参考资料
因此对于判断a >= b
,以下代码就算写了也不会调用:
class Solution{
public:
friend bool operator >= (const pair<int, int>& a, const pair<int, int>& b){
cout<<"a.second: "<<a.second;
cout<<"b.second: "<<b.second;
return a.second >= b.second;
}
friend bool operator < (const pair<int, int>& a, const pair<int, int>& b){
return !(a>=b);
}
};
【解决方案】(不推荐)
把运算符重载函数拧出来放到一个单独的名称空间中,去掉友元,然后显式调用运算符重载函数,即namespace_name:: operator>=(num1, num2)
:
namespace XX{
bool operator >= (const pair<int, int>& a, const pair<int, int>& b){
cout<<"a.second: "<<a.second;
cout<<"b.second: "<<b.second;
return a.second >= b.second;
}
bool operator < (const pair<int, int>& a, const pair<int, int>& b){
return !(a>=b);
}
}
class Solution{
//code
if(XX: operator>=(num1, num2)){
//....
}
};
然而这么写还不如不写这个重载函数,没啥意义!!
所以还是别想着重载运算符了,反正做题也用不到~
顺便提一下,我写这个重载函数的目的是比较pair<int, int>
元素的大小并作交换,这里是把整体全做交换(键+键值),然而std
中的重载函数只交换second
(键值),也正因如此我一直找不到程序出错的地方,“白白浪费”了一个下午时间,记录一下防止再犯,也希望对同样为之所困的伙伴提供些帮助。
以上描述中若有哪里存在问题希望各位大佬们批评指正~