如何使用C ++遍历Google protobuf地图?

时间:2018-08-13 10:11:09

标签: c++ protocol-buffers

我的地图格式如下:

const google::protobuf::Map<string, nrtprofile::RedisNewsMetric> map=redisNewsMessage.ig();

我应该如何遍历地图以获取所有键和对应的值?

3 个答案:

答案 0 :(得分:3)

您以与google::protobuf::Map完全相同的方式遍历std::unordered_map

for (auto & pair : map)
{
    doSomethingWithKey(pair.first);
    doSomethingWithValue(pair.second);
}

如果您使用的是C ++ 17编译器,则可以使用结构化绑定来进一步拆分

for (auto & [key, value] : map)
{
    doSomethingWithKey(key);
    doSomethingWithValue(value);
}

答案 1 :(得分:2)

能够与protobuf Map进行结构化绑定for

for (auto & [key, value] : map) {
}

您需要包含以下代码来告诉编译器执行此操作:

namespace std {
    template<typename TK, typename TV>
    class tuple_size<google::protobuf::MapPair<TK,TV>> : public std::integral_constant<size_t, 2> { };

    template<size_t I, typename TK, typename TV> 
    struct tuple_element< I, google::protobuf::MapPair<TK, TV>> { };
    template<typename TK, typename TV> struct tuple_element<0, google::protobuf::MapPair<TK, TV>> { using type = TK; };
    template<typename TK, typename TV> struct tuple_element<1, google::protobuf::MapPair<TK, TV>> { using type = TV; };

    template<int I, typename TK, typename TV>
    auto get(const google::protobuf::MapPair<TK, TV>& x) {
        if constexpr (I == 0) return x.first;
        if constexpr (I == 1) return x.second;
    }
}

答案 2 :(得分:1)

documentation

  

google :: protobuf :: Map是一种特殊的容器类型,用于协议缓冲区中以存储地图字段。从下面的界面可以看到,它使用了std :: map和std :: unordered_map方法的常用子集

  

google :: protobuf :: Map支持与std :: map和std :: unordered_map相同的迭代器API。如果您不想直接使用google :: protobuf :: Map,则可以通过执行以下操作将google :: protobuf :: Map转换为标准地图:

因此,下面的示例代码中显示的两种方法都应该起作用:

int main ()
{
  std::map<char,int> mymap;

  mymap['b'] = 100;
  mymap['a'] = 200;
  mymap['c'] = 300;

  // show content:
  for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';

  for (auto& x : mymap)
    std::cout << x.first << " => " << x.second << '\n';

  return 0;
}