我可以以某种方式使用自己的函数在多图中对对进行排序吗?我有三个类CTimeStamp,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;
}

我不确定如何执行此操作,甚至不确定。

最佳答案



std::multimap documentation开始,您只需要

  • 提供std::less<CTimeStamp>的特化
    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&,const CTimeStamp&)的可调用都非常合适。

    您可能还会编写一个简单的全局函数
    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()) {}
    

    关于c++ - C++:对象键的 multimap 自定义比较器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55553920/

    10-11 11:00