2

我有一个类,我重载了所有比较运算符。我将一堆这些对象作为键加载到地图中,并且我希望地图能够将它们从最小到最大排序。

但是,地图实际上是按从大到小排序的。为什么是这样?它在对地图进行排序时不使用键上的比较运算符吗?我怎样才能让它做到这一点?

4

2 回答 2

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 >

实际测试必须符合以下要求,否则您会遇到各种问题:

  • lhs < rhs = 真
  • rha < lhs = 假
  • lhs < lhs = 假

需要注意的一件重要的事情(我最近发现)是,如果您的编译器开始抱怨您重新定义了std::less或其他时髦事物的含义,则可能是您仅YourType在声明std::map< YourType >.

希望这可以帮助!

于 2012-05-24T08:58:58.930 回答
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; 
}
于 2012-05-24T08:18:05.797 回答