使用protobuf对象作为std :: map中的键

时间:2019-04-06 19:34:02

标签: c++ protocol-buffers protobuf-c

我对协议缓冲区的概念并不陌生,如果我将protobuf对象用作std::map中的键,则手头的任务可以解决。

我知道能够使用protobuf对象作为密钥,我需要为std::map提供一个自定义比较器,以保持密钥的顺序。

目前我有两个问题:

  1. google / protobuf / util中是否有任何实用程序函数/类的重载量小于运算符,用于比较两个protobuf消息?即与此类似。
bool operator<(google::protobuf::Message m1, google::protobuf::Message m2){
    // compare the protobuf messages
    // and finally return the value
    return value;
} 
  1. 我可能意识到的任何潜在副作用,可能是由于使用protobuf对象作为键而引起的?

1 个答案:

答案 0 :(得分:1)

我建议最好不要使用std::unordered_map而不是std::map。这不仅是最佳的,而且不易出错。如果使用比较器,则必须确保Message m1大于Message m2并且Message m2大于Message m3,然后Message m1大于比Message m3。 (因为您的定义对我来说还不清楚,所以提及。)

您可以使用MessageDifferencer代替std:equal_to。另请参见Google protocol buffers compare

的答案

但是,正如您正确指出的那样,没有std::hash等效项,您将需要提供一个自定义哈希函数。请参阅PR-2066PR-2304,其中讨论了此缺少的功能。

在拉取请求中,引用xfxyjwf

  

使用原始消息作为键不是一个好主意,因为它们不是真正的值类型。在存在未知字段的情况下,一个二进制文件中的两个相等的消息可能被另一个二进制文件视为不同,因此即使给定完全相同的输入数据,两个不同的二进制文件也可能会获得两个不同的unordered_map <>(如果使用MessageDifferencer实现了哈希函数) 。最好编写具有所需行为的自己的哈希函数,而不是对通用函数进行答复。

如果您没有未知字段,则通用哈希函数应该可以正常工作。