首页 > 解决方案 > 是否有可能有一个关联有序容器,它可以按对象的成员而不是对象本身进行排序?

问题描述

例如:

如果我想创建一个消息管理器,它在其他功能中将维护一个按时间排序的消息列表,结构如下。

class Message
{
    MessageHeader header;
    MessageData data;
};

除了其他元素之外,标题结构将包含创建时间戳。

struct MessageHeader
{
    uint64_t timeStamp;
    userId_t sender;
    userId_t receiver;
    /* ... */
};

是否可以使用 STL 库中的现有容器按时间戳对消息进行排序?我将使用纳秒时间戳,因此不是唯一值的可能性很低。

标签: c++stlcontainers

解决方案


是的。

有序容器通常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

这意味着:如果两个不同的消息具有相同的时间戳,那么它们中的任何一个都不会比另一个小,因此它们被映射认为是等效的。您应该确保不会发生这种情况,确保不同的消息具有不同的时间戳。


推荐阅读