我的地图格式如下:
const google::protobuf::Map<string, nrtprofile::RedisNewsMetric> map=redisNewsMessage.ig();
我应该如何遍历地图以获取所有键和对应的值?
答案 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)
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;
}