C ++:对象键的多图自定义比较器

时间:2019-04-06 22:15:12

标签: c++ comparator multimap

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

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

1 个答案:

答案 0 :(得分:3)

  

在插入此多图时,我需要以某种方式使用CTimeStamp中的Compare方法

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()) {}