C++ protobuf映射字段中元素的顺序

C++ protobuf映射字段中元素的顺序,c++,protocol-buffers,C++,Protocol Buffers,我在协议缓冲区消息中定义了许多映射字段。这些消息填充在C++中,并在不同的C++组件中接收,使用“代码>描述符< /COD>和反射< /代码> API。 给定一个映射字段,例如: map <int32, int32> my_map = 1; 我已经了解了描述符和反射API的当前限制,这里我必须通过迭代接收到的数据来执行查找。当然,如果我想在接收到的映射字段中进行多次查找,我可以将所有数据放在一些更合适的数据结构中,例如std::unordered_map,但我通常只对每个接收到的映

我在协议缓冲区消息中定义了许多映射字段。这些消息填充在C++中,并在不同的C++组件中接收,使用“代码>描述符< /COD>和<代码>反射< /代码> API。 给定一个映射字段,例如:

map <int32, int32> my_map = 1;
我已经了解了
描述符
反射
API的当前限制,这里我必须通过迭代接收到的数据来执行查找。当然,如果我想在接收到的映射字段中进行多次查找,我可以将所有数据放在一些更合适的数据结构中,例如
std::unordered_map
,但我通常只对每个接收到的映射字段进行一次查找


我可以假设一下接收数据的顺序吗?由于协议缓冲区实现中使用的底层数据结构,重复的my_map_条目消息是否有序?如果是这样,当找到较大的键时,可以停止在映射中查找整数键。在处理我的应用程序中接收到的映射字段时,这可能会给我一个潜在的优化。

你不能假设序列化后映射的顺序是相似的

以下引文摘自:

映射值的线格式排序和映射迭代排序为 未定义,因此您不能依赖地图项目处于特定状态 命令

通常protobuf可以按随机顺序序列化字段

message my_map_entry {
  int32 key = 1;
  int32 value = 2;
}
repeated my_map_entry my_map = 1;