使用 protobuf 对象作为 std::map 中的键
Using protobuf objects as key in the std::map
我是协议缓冲区概念的新手,手头有一个任务,如果我使用 protobuf 对象作为std::map
中的键,就可以解决。
我知道要使用 protobuf 对象作为键,我需要为std::map
提供一个自定义比较器来维护键的顺序。
我现在有两个问题:
在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;
}
- 我可能意识到的任何潜在副作用,可能是由于使用 protobuf 对象作为键而产生的?
如果您不关心顺序,我建议最好使用std::unordered_map
而不是std::map
。这不仅是最佳的,而且不易出错。在比较器实现的情况下,您必须确保Message m1
是否大于Message m2
并且Message m2
大于Message m3
,则Message m1
大于Message m3
。(提到,因为我从你的定义中不清楚)。
您可以使用 MessageDifferencer 作为std:equal_to
的替代品。另请参阅谷歌协议缓冲区比较的答案
但是,正如您正确指出的那样,没有等效于std::hash
,您将需要提供自定义哈希函数。请参阅 PR-2066 和 PR-2304,其中讨论了此缺失的功能。
从拉取请求中,引用 xfxyjwf:
使用 proto 消息作为键不是一个好主意,因为它们不是真正的值类型。由于存在未知字段,一个二进制文件中的两个相等消息可能会被另一个二进制文件视为不同,因此即使给定完全相同的输入数据,两个不同的二进制文件也可能获得两个不同的unordered_map<>(如果使用 MessageDifferencer 实现哈希函数)。最好编写自己的哈希函数,该函数具有您想要的行为,而不是回复通用的哈希函数。
如果您没有未知字段,则通用哈希函数应该可以正常工作。
相关文章:
- 存储在 std::map/std::set 中,与在存储所有数据后对向量进行排序
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 无法在 std::map<std::string,std::shared_ptr 中设置值<class>>
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- issue with std::map std::find
- 为什么 std::map< std::map >不释放内存?
- C++ map<std::string> vs map<char *> 性能(我知道,"again?" )
- 确定运行时std::map/std::set的内存使用情况
- 映射上的模板参数无效 std::map< std::string, Stock*> &Stock
- 我的SFINAE检查std::map/std::vector有什么问题
- 使用 std::map<std::string, int> 计算表达式树
- 将数据从两种不同的数据结构插入 std::map <std::string, int> mymap 并通过套接字发送
- 类中的编译器错误,数据类型为 typedef map<std::string,std::p air<std::string,vector<int>>> MapPai
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 如何填写和访问 std::map<std::p air<enum1, enum2>, funcPtr>?
- 二进制'<':找不到 map<std::string shared_ptr 的运算符<Foo>>
- 如何将 2 个字符* 数组直接映射到 std::map<std::string,std::string>
- C++ std::map<std::string, int> 获取键以特定字符串开头的值
- 从取消引用的迭代器返回 std::map<std::string, int> 时出现巨大的内存泄漏