C ++: многокарточный пользовательский компаратор для ключей объекта - PullRequest
1 голос
/ 07 апреля 2019

Могу ли я как-то использовать свою собственную функцию для упорядочения пар в мультикарте? У меня есть три класса CTimeStamp, CMail и CMailLog. И дело в CMailLog у меня есть multimap<CTimeStamp, CMail>, который я использую, потому что для этой задачи мне нужно решение, которое будет очень быстрым для огромных объемов данных, и поэтому мне нужно было бы каким-то образом использовать метод Compare из CTimeStamp при вставке в эту мультикарту. Классы выглядят примерно так.

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

Я не уверен, как это сделать, или если это вообще возможно.

1 Ответ

3 голосов
/ 07 апреля 2019

Мне нужно как-то использовать метод Compare из CTimeStamp при вставке в эту мультикарту

Начиная с std::multimap документации , все, что вам нужно, это либо

  • укажите специализацию для 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; }) 
    {}
    

Я использовал лямбда-выражение в своем последнем примере для конструктора, так как считаю, что это самая короткая и наиболее понятная форма.
На самом деле любой вызываемый с подписью 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()) {}
...