【问题标题】:C++ std::map key sort comparison function?C++ std::map 键排序比较函数?
【发布时间】:2012-05-27 15:33:15
【问题描述】:

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

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

【问题讨论】:

  • 请贴代码,不看代码无法回答。
  • std::map 默认使用operator<。你确定你对operator< 的实现没有倒退吗?
  • 您如何检查订单?您可以手动检查预期的订购,例如cout << obj1 << " < " << obj2 << " is " << boolalpha << (obj1 < obj2) << endl;

标签: c++ stl map


【解决方案1】:

如果您查看 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&lt; YourType &gt;。

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

  • lhs
  • rha
  • lhs

需要注意的重要一点(我最近发现的)是,如果您的编译器开始抱怨您重新定义了 std::less 的含义或其他时髦的东西,可能是您只转发声明了您的 @ 987654327@ 当你声明你的std::map&lt; YourType &gt;。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您应该发布实现比较运算符重载的代码,因此答案可能基于猜测:

    您的问题可能是一个简单的错字(我曾经这样做过)

    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; 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2013-01-05
      • 2021-12-11
      • 2015-05-11
      相关资源
      最近更新 更多