使用分配器对哈希映射进行高效的序列化和反序列化
Efficient serialization and deserialization of a hash map using the allocator
有没有一种简单的方法可以在C++中使用带有无序哈希映射或多映射的自定义分配器(或者更好的是,通过配置标准分配器),从而使键、值和bucket结构始终以相对压缩的形式保存在连续内存中?
如果是这样的话,那么这样的分配器是否可以用于保存和恢复映射,而不需要显式的序列化要求,即遍历键,然后通过插入进行恢复?
如果没有,是否有其他方法可以序列化和反序列化哈希映射,而不需要在反序列化过程中重新哈希每个键?
有没有一种简单的方法可以使用自定义分配器
是
(或者,更好的是,通过配置标准分配器)
无
使用C++中的无序哈希映射或多映射,以便键、值和桶结构始终以相对压缩的形式保存在连续内存中?
是
如果是,那么这样的分配器是否可以用于保存和恢复映射,而不需要显式的序列化要求,即遍历密钥,然后通过插入进行恢复?
不,因为在程序的两次运行之间,标准规定不能假设哈希是相同的。
但是你的问题有一个错误的前提。这不是串行化一个无序映射的方法。
如果没有,是否有其他方法可以序列化和反序列化哈希映射,而不需要在反序列化过程中重新哈希每个键?
是-用于串行化:
serialise_length(archive, map.size());
for (auto const& element : map)
{
auto const& key = element.first;
auto const& value = element.second;
serialise_nvp(archive, key, value);
}
当然,您将提供serialise_length()
和serialise_nvp()
函数以及archive
对象。
用于取消序列化:
auto map = std::unordered_map<Key, Value>();
auto length = deserialise_length(archive);
map.reserve(length);
while (length--)
{
auto key = deserialise<Key>(archive);
auto value = deserialise<Value>(archive);
map.emplace(std::move(key), std::move(value));
}
或
auto map = std::unordered_map<Key, Value>();
auto length = deserialise_length(archive, length);
map.reserve(length);
while (length--)
{
auto kv = deserialise_nvp<Key, Value>(archive);
map.insert(std::move(kv));
}
反向双链表分配器,当上一个指向上一个下一个,下一个指向前一个上一个时(想象一下它在3D中,反向lotus(而不是程序))。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- 大多数基本类型的高效二进制序列化
- 使用分配器对哈希映射进行高效的序列化和反序列化