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

C++: multimap custom comparator for object keys

我能否以某种方式使用我自己的函数来对多映射中的对进行排序?我有三个 类 CTimeStamp、CMail 和 CMailLog。事情在我的 CMailLog 中 multimap<CTimeStamp, CMail> 我使用它是因为对于此任务我需要解决方案,该解决方案对于大量数据来说非常快,因此我需要以某种方式使用 CTimeStamp 中的比较方法插入到此多映射中。 类 看起来像这样。

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

我不确定该怎么做,或者是否可行。

I would need to somehow use method Compare from CTimeStamp when inserting into this multimap

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