c++ - 是否有可能有一个关联有序容器,它可以按对象的成员而不是对象本身进行排序?
问题描述
例如:
如果我想创建一个消息管理器,它在其他功能中将维护一个按时间排序的消息列表,结构如下。
class Message
{
MessageHeader header;
MessageData data;
};
除了其他元素之外,标题结构将包含创建时间戳。
struct MessageHeader
{
uint64_t timeStamp;
userId_t sender;
userId_t receiver;
/* ... */
};
是否可以使用 STL 库中的现有容器按时间戳对消息进行排序?我将使用纳秒时间戳,因此不是唯一值的可能性很低。
解决方案
是的。
有序容器通常operator<
默认使用,并允许您指定自定义比较器。例如,std::map<Message>
您需要添加的是:
struct Message
{
MessageHeader header;
MessageData data;
bool operator<(const Message& other) const {
return header.timeStamp < other.header.timeStamp;
}
};
根据时间戳对地图进行排序。
但是,请注意,此比较用于根据以下内容建立等效概念:
!comp(a,b) && !comp(b,a) => a is equivalent to b
这意味着:如果两个不同的消息具有相同的时间戳,那么它们中的任何一个都不会比另一个小,因此它们被映射认为是等效的。您应该确保不会发生这种情况,确保不同的消息具有不同的时间戳。
推荐阅读
- dns - 您能否覆盖已委派给另一个名称服务器的 DNS 条目?
- c++ - E0312 IntelliSense 无法转换 _Binder
- javascript - 在@media print 上更改页面大小时更改css样式
- ios - Swift addTarget 到按钮并从 UIview 文件调用不同 View Controller 文件中的函数
- android - android房间总是在数据库检查器中显示关闭
- python - 空图。怎么修?
- javascript - 创建和附加/删除与 display:block/display:none
- excel - 当excel列中的值发生变化时添加3个空白行
- javascript - React App 锚点外部链接不适用于移动设备的额外点击
- arrays - 如何计算数组中的行数?