我有一个类,我重载所有的比较运算符。我将一堆这些对象作为键加载到地图中,我期望地图将它们排序到最小到最大。
但是,地图实际上按最大到最小排序。为什么是这样?在对地图进行排序时,它是否不使用键上的比较运算符?我该怎么做呢?
答案 0 :(得分:2)
如果你看一下std :: map的定义,第三个参数是比较器 - 默认为std::less< Key >
。其默认实现只是调用operator<
。
您可以尝试在定义YourType
的标题中定义新版本,如下所示:
template<> std::less< YourType >
{
bool operator()(
const YourType& lhs,
const YourType& rhs)
{
if(!(lhs.member1 < rhs.member1))
{
return false;
}
if(!(lhs.member2 < rhs.member2))
{
return false;
}
return true;
}
}
请记住您班上的朋友std::less< YourType >
。
实际测试必须符合以下要求,否则您将遇到各种问题:
需要注意的一件重要事情(我最近才发现)是,如果你的编译器开始抱怨你已经重新定义了std::less
或其他时髦事物的含义,那么你可能只会向前宣布您宣布YourType
时的std::map< YourType >
。
希望这有帮助!
答案 1 :(得分:0)
您应该发布实现比较运算符重载的代码,因此可以基于猜测来回答:
你的问题可能是一个简单的错字(我做过一次)
bool operator < ( T lhs, T rhs ) const
{
return rhs < lhs; // note: lhs is on the right!
}
但实际上你想要:
bool operator < ( T lhs, T rhs ) const
{
return lhs < rhs;
}