Есть простой способ использовать пользовательский аллокатор
Да
(или, еще лучше, путем настройки стандартного аллокатора)
Нет
с неупорядоченной картой хэша или мультимапом на 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));
}