我对协议缓冲区的概念并不陌生,如果我将protobuf对象用作std::map
中的键,则手头的任务可以解决。
我知道能够使用protobuf对象作为密钥,我需要为std::map
提供一个自定义比较器,以保持密钥的顺序。
目前我有两个问题:
bool operator<(google::protobuf::Message m1, google::protobuf::Message m2){
// compare the protobuf messages
// and finally return the value
return value;
}
答案 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-2066和PR-2304,其中讨论了此缺少的功能。
在拉取请求中,引用xfxyjwf:
使用原始消息作为键不是一个好主意,因为它们不是真正的值类型。在存在未知字段的情况下,一个二进制文件中的两个相等的消息可能被另一个二进制文件视为不同,因此即使给定完全相同的输入数据,两个不同的二进制文件也可能会获得两个不同的unordered_map <>(如果使用MessageDifferencer实现了哈希函数) 。最好编写具有所需行为的自己的哈希函数,而不是对通用函数进行答复。
如果您没有未知字段,则通用哈希函数应该可以正常工作。