Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在std::map中将protobuf对象用作键_C++_Protocol Buffers_Protobuf C - Fatal编程技术网

C++ 在std::map中将protobuf对象用作键

C++ 在std::map中将protobuf对象用作键,c++,protocol-buffers,protobuf-c,C++,Protocol Buffers,Protobuf C,我不熟悉协议缓冲区的概念,手头有一项任务,如果我在std::map中使用protobuf对象作为键,就可以解决这个任务 我知道为了能够使用protobuf对象作为键,我需要为std::map提供一个自定义比较器来维护键的顺序 此时此刻,我有两个问题: google/protobuf/util中是否有重载小于运算符的实用程序函数/类用于比较两条protobuf消息?i、 类似的东西 bool操作符如果你不在乎顺序,我建议最好使用std::unordered_map而不是std::map。这不仅是最

我不熟悉协议缓冲区的概念,手头有一项任务,如果我在
std::map
中使用protobuf对象作为键,就可以解决这个任务

我知道为了能够使用protobuf对象作为键,我需要为
std::map
提供一个自定义比较器来维护键的顺序

此时此刻,我有两个问题:

  • google/protobuf/util中是否有重载小于运算符的实用程序函数/类用于比较两条protobuf消息?i、 类似的东西
    bool操作符如果你不在乎顺序,我建议最好使用
    std::unordered_map
    而不是
    std::map
    。这不仅是最优的,而且不容易出错。在比较器实现的情况下,您必须确保如果
    消息m1
    大于
    消息m2
    消息m2
    大于
    消息m3
    ,则
    消息m1
    大于
    消息m3
    。(提到这一点是因为我对你的定义不清楚)

    您可以使用替换为
    std:equal_to
    。另请参见第页的答案

    但是,正如您正确指出的那样,没有等效于
    std::hash
    ,您将需要提供一个自定义hash函数。请参阅并讨论此缺失的功能

    从拉动请求中,引用:

    使用proto消息作为键不是一个好主意,因为它们不是真正的值类型。在存在未知字段的情况下,一个二进制文件中的两条相等消息可能会被另一个二进制文件视为不同,因此,即使给定完全相同的输入数据,两个不同的二进制文件也可能得到两个不同的无序映射(如果使用MessageDifferenticer实现哈希函数)。编写自己的具有所需行为的哈希函数可能比使用一般的哈希函数更好


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

    您真的需要
    std::map
    ?你能用
    std::unordered_map
    来代替吗?是的,但是在这种情况下,我需要一个等式和一个用于protobuf消息的散列函数。在原BUTF UTLS模块中有一个相等的函数,但是没有哈希函数。@ MukulGupta在UTILS模块中有函数来计算原Bufff消息的哈希吗?C++中没有我知道的。
    bool operator<(google::protobuf::Message m1, google::protobuf::Message m2){
        // compare the protobuf messages
        // and finally return the value
        return value;
    }