【问题标题】:C++: multimap custom comparator for object keysC++:对象键的多图自定义比较器
【发布时间】:2019-04-06 22:15:11
【问题描述】:

我能否以某种方式使用我自己的函数对多图中的对进行排序?我有三个类 CT​​imeStamp、CMail 和 CMailLog。事情在我拥有的 CMailLog 中 我之所以使用multimap<CTimeStamp, CMail>,是因为对于这项任务,我需要对大量数据非常快的解决方案,因此在插入此多图时,我需要以某种方式使用 CTimeStamp 中的方法 Compare。这些类看起来像这样。

class CTimeStamp {
   public:
     int compare (const CTimeStamp &x) const;
     ...
}
class CMail {
   ...
}
class CMailLog {
   public:
     ...
   private:
     multimap<CTimeStamp, CMail> logs;
}

我不知道该怎么做,或者是否可能。

【问题讨论】:

    标签: c++ comparator multimap


    【解决方案1】:

    当插入这个多图时,我需要以某种方式使用来自CTimeStamp 的方法比较

    std::multimap documentation 开始,您所需要的只是任一

    • std::less&lt;CTimeStamp&gt;提供专业化

      namespace std {
          bool less<CTimeStamp>(const CTimeStamp& a, const CTimeStamp& b) {
              return a.compare(b) < 0;
          }
      }
      

    • 在构造函数中提供自定义比较器:

      CMailLog() : 
          logs([](const CTimeStamp& a, const CTimeStamp& b) { return a.compare(b) < 0; }) 
      {}
      

    我在上一个示例中为构造函数使用了 lambda 表达式,因为我认为这是最短且最易于理解的形式。
    事实上,任何带有签名 bool (const CTimeStamp&amp;,const CTimeStamp&amp;) 的可调用对象都非常适合。

    你也可以写一个简单的全局函数

    bool foo(const CTimeStamp& a,const CTimeStamp& b) {
        return a.compare(b) < 0;
    }
    

    或适当的可调用类型

    struct foo {
        bool operator()(const CTimeStamp& a,const CTimeStamp& b) {
            return a.compare(b) < 0;
        }
    };
    

    然后在

    multimap<CTimeStamp, CMail> logs;
    

    在构造函数初始化列表中:

    CMailLog() : logs(foo) {}
    

    可调用的结构版本

    CMailLog() : logs(foo()) {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多