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()) {}
我能否以某种方式使用我自己的函数来对多映射中的对进行排序?我有三个 类 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()) {}