(標準アロケータを構成することによって、いっそのか、)カスタムアロケータ
はい
を使用する簡単な方法があります
ませ
ん
をC++の順序付けられていないハッシュマップまたはマルチマップと組み合わせることで、キー、値、およびバケット構造が常に比較的パックされた形式で連続したメモリに保持されるようにします。
はい
そうである場合には、そのようなアロケータは、次いで、キーを反復処理し、次いで挿入することによって復元の明示的なシリアライゼーション要件なしでマップを保存し、復元するために使用することができますか?
ない、なぜならプログラムの2つの実行の間、標準を使用すると、ハッシュが同じであることを仮定することはできませんと言います。
あなたの質問には間違った前提があります。これは、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));
}