使用分配器对哈希映射进行高效的序列化和反序列化

Efficient serialization and deserialization of a hash map using the allocator

本文关键字:高效 序列化 反序列化 分配器 哈希 映射      更新时间:2023-10-16

有没有一种简单的方法可以在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(而不是程序))。