有没有一种简单的方法可以将自定义分配器(或者更好的是通过配置标准分配器)与C++中的无序哈希映射或多重映射一起使用,以使键,值和存储桶结构始终保持在相对内存中的连续内存中包装形式?
如果是这样,那么可以使用这样的分配器来保存和恢复映射,而无需显式的序列化要求,即遍历键,然后通过插入进行还原?
如果不是,是否有另一种方法可以对哈希映射进行序列化和反序列化,而不必在反序列化期间重新哈希每个密钥?
最佳答案
是
没有
是
不可以,因为在程序的两次运行之间,该标准表示您无法假设哈希值是相同的。
但是您的问题有一个错误的前提。这不是序列化unordered_map的方法。
是-序列化:
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));
}