2012-02-22 2 views
1

Я хочу сериализовать hash_multimap, поддерживает ли его протокальные буферы? Я попытался увеличить serializaitn, но у него есть путаница заголовка файла hash_multimap, поэтому я хочу попробовать буферы протокола google.Могут ли протокольные буферы сериализовать hash_multimap?

+0

Я бы рекомендовал вы получите путаницу в заголовке, отсортированную для повышения сериализации :) вместо того, чтобы идти в буфер протокола, если p Эрективность очень важна. – Arunmu

ответ

2

Существует неплохая кодировка с использованием протокольных буферов, и вам нужно запустить свой компилятор protoc для генерации фактического C++ из файлов .proto, но в остальном они великолепны.

Вот пример того, как вы бы сериализация и разобрать зЬй :: hash_multimap

my_hash_multimap.proto

message MyHashMultimap { 
    message Pair { 
    required int64 key = 1; 
    required bytes value = 2; 
    } 
    repeated Pair pair = 1; 
} 

main.cpp

#include <algorithm> 
#include <hash_map> 
#include <iostream> 
#include <string> 
#include <utility> 

#include "my_hash_multimap.pb.h" 

int main() { 
    std::hash_multimap<int, std::string> hm; 
    hm.insert(std::make_pair(3, "three")); 
    hm.insert(std::make_pair(2, "two")); 
    hm.insert(std::make_pair(1, "one")); 

    // convert std::hash_multimap to a protobuf MyHashMultimap 
    MyHashMultimap proto_hm; 
    std::for_each(hm.begin(), 
       hm.end(), 
       [&proto_hm](std::pair<int, std::string> p) { 
    std::cout << p.first << " " << p.second << std::endl; 
    // add new Pair to proto_hm 
    MyHashMultimap::Pair* proto_pair(proto_hm.add_pair()); 
    // set this Pair's values 
    proto_pair->set_key(p.first); 
    proto_pair->set_value(p.second); 
    }); 

    // serialise proto_hm to a std::string 
    std::string serialised_hm(proto_hm.SerializeAsString()); 

    // parse from this string to a new MyHashMultimap 
    MyHashMultimap parsed_proto_hm; 
    if (!parsed_proto_hm.ParseFromString(serialised_hm)) 
    return -1; 
    std::cout << std::endl << parsed_proto_hm.DebugString() << std::endl << std::endl; 

    // convert protobuf MyHashMultimap to a std::hash_multimap 
    std::hash_multimap<int, std::string> parsed_hm; 
    for (int i(0); i != parsed_proto_hm.pair_size(); ++i) { 
    // check required fields are populated correctly 
    if (parsed_proto_hm.pair(i).IsInitialized()) { 
     // add the Pair to parsed_hm 
     parsed_hm.insert(std::make_pair(parsed_proto_hm.pair(i).key(), 
             parsed_proto_hm.pair(i).value())); 
    } 
    } 

    std::for_each(parsed_hm.begin(), 
       parsed_hm.end(), 
       [](std::pair<int, std::string> p) { 
    std::cout << p.first << " " << p.second << std::endl; 
    }); 

    return 0; 
} 
+0

Я не думаю, что hash_multimap является частью стандарта. –

+0

Я считаю, что вы правы, но некоторые реализации STL предоставляют hash_multimap в пространстве имен std. – Fraser

Смежные вопросы