C ++ std :: map键排序比较功能?

时间:2012-05-21 05:52:00

标签: c++ stl map

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

但是,地图实际上按最大到最小排序。为什么是这样?在对地图进行排序时,它是否不使用键上的比较运算符?我该怎么做呢?

2 个答案:

答案 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 >

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

  • lhs&lt; rhs = true
  • rha&lt; lhs = false
  • lhs&lt; lhs = false

需要注意的一件重要事情(我最近才发现)是,如果你的编译器开始抱怨你已经重新定义了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; 
}