我有一个类,我重载了所有比较运算符。我将一堆这些对象作为键加载到地图中,并且我希望地图能够将它们从最小到最大排序。
但是,地图实际上是按从大到小排序的。为什么是这样?它在对地图进行排序时不使用键上的比较运算符吗?我怎样才能让它做到这一点?
如果您查看 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 >
.
希望这可以帮助!
您应该发布实现比较运算符重载的代码,因此答案可能基于猜测:
你的问题可能是一个简单的错字(我做过一次)
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;
}