1

Существует простой способ использования настраиваемого распределителя (или, еще лучше, путем настройки стандартного распределителя) с неупорядоченной картой хэша или мультимапом на C++, чтобы ключи, значения и структура ковша всегда хранятся в непрерывной памяти в относительно упакованной форме?Эффективная сериализация и десериализация хэш-карты с использованием распределителя

Если да, то может ли такой распределитель использоваться для сохранения и восстановления карты без явного требования к сериализации итерации через ключи, а затем восстановления путем вставки?

Если нет, существует ли другой способ сериализации и десериализации хеш-карты, которая не требует повторного перебора каждой клавиши во время десериализации?

ответ

2

Есть простой способ использовать пользовательский аллокатор

Да

(или, еще лучше, путем настройки стандартного аллокатора)

Нет

с неупорядоченной картой хэша или мультимапом на 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)); 
} 
0

Перевернутый распределитель списка с двойными связями, когда предыдущие пункты в предыдущих следующих и последующих точках предыдущего предыдущего (представьте это в 3D, перевернутый лотос (не программа)).

Смежные вопросы