dar*_*sys 3 c++ serialization boost unordered-map
我有一个程序,它使用带有此定义的无序映射:
unordered_map<const char*, vector<pair<int, int> >, function<unsigned int (const char *str)> > myMap(30000, hashing);
Run Code Online (Sandbox Code Playgroud)
其中散列是一个用于散列键的函数.我的问题是 - >如何序列化这种结构并在之后反序列化?我真的需要它,并尽可能快速有效.我一直在阅读有关boost库的内容,但我不太了解如何将它们与这种东西一起使用.我知道有一些无序地图的升级库,但是,显然我做错了,编译器会抛出很多错误.有人可以给我一个示例代码,如何序列化这个?谢谢.
Mat*_* M. 11
TL; DR您无法序列化std::function,而是使用常规谓词类.
序列化地图(不管是哪种类型)都很容易.从根本上说它是:
typedef std::map<std::string, std::string> Map;
void serialize(Serializer& out, Map const& map) {
out << map.size();
for (auto const& p: map) { out << p.first << p.second; }
}
Map deserialize(Deserializer& in) {
Map map;
size_t size = 0;
in >> size;
for (size_t i = 0; i != size; ++i) {
Map::key_type key;
Map::mapped_type value;
in >> key >> value;
map[key] = value;
}
return map;
}
Run Code Online (Sandbox Code Playgroud)
除了在一般情况下,比较器和分配器都可以是有状态的吗?
void serialize(Serializer& out, Map const& map) {
+ out << map.value_compare() << map.get_allocator();
out << map.size();
for (auto const& p: map) { out << p.first << p.second; }
}
Map deserialize(Deserializer& in) {
+ Map::key_compare comparator;
+ Map::allocator_type allocator;
+
+ in >> comparator >> allocator;
+
+ Map map(comparator, allocator)
size_t size = 0;
in >> size;
for (size_t i = 0; i != size; ++i) {
Map::key_type key;
Map::mapped_type value;
in >> key >> value;
map[key] = value;
}
return map;
}
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,假设Boost.Serialization知道如何处理std::allocator(它是无状态的),它应该如何序列化std::function<unsigned int(char const*)>?
答:这是不可能的,因为std::function执行类型擦除和这与C++静态类型性质的冲突(以及它缺乏内省).一旦类型被擦除,通常不可能恢复它.
你需要比较器的类型在OR 的类型中是明确的,map以便有一个外部平均值来查找它.无论如何,它可能很难适应Boost.Serialization(无上下文).你可能会更好地使用常规谓词类.