多个键的c ++ stl选择

c++ stl selection for multiple keys

c++ stl专家, 在协议栈实现中,我有一条消息从一层发送到另一层。源层存储一些信息,并在接收到来自第二层的响应时处理这些信息。

现在存储的信息有3个参数,用于比较目标层的响应。 (得到正确的)。即让我们说会话 ID、请求编号和 infoID。存储的信息包含一个结构,比方说结构 A.

在源层中实现此功能以存储信息的最佳方式是什么?

一开始我想到了下面的,因为当时只有两个键

 std::map<std::pair<u32, u32>, StructA> m_mSessionId2RNum2StructA;

但稍后需要另一个密钥。这变得复杂了

struct StructZ
{
     u32 InfoId;
     StructA stStructA;
};

std::map<std::pair<u32, u32>, StructZ> m_mSessionId2RNum2StructZ;

这看起来不太好。任何 inputs/suggestions 改进这一点非常感谢 谢谢 ~pdk

也许 StructK 可以作为 StructA 的键作为映射中的值:

struct StructK
{
     u32 k1;
     u32 k2;
     u32 k3;
};

inline bool operator< (const StructK& lhs, const StructK& rhs)
{
    if(lhs.k1 < rhs.k1)
        return true;
    else
        if(lhs.k1 == rhs.k1)
        {
            if(lhs.k2 < rhs.k2)
                return true;
            else
                if(lhs.k2 == rhs.k2)
                {
                    return lhs.k3 < rhs.k3;
                }
                else
                    return false;
        }
        else
            return false;
}

然后

 map<StructK, StructA> myMap;

当然,您可以对operator<

使用任何逻辑

std::pair 是一种特殊类型的 std::tuple,它只能包含两个值,而 tuple 可以包含几十 (1) 个值。 IE。您现在似乎想要 std::tuple<u32, u32,u32> 作为键。

您使用 tuple 免费获得 operator<,与使用 pair 相同。

如果您需要 备用 索引,即按关键字 1、2 3 进行搜索,那么您需要 boost::multi_index 个容器.

(1) 检查您的实施以获得精确的限制。