1

C++の順序付けられていないハッシュマップまたはマルチマップを使用してカスタムアロケータを使用する(単純に標準アロケータを構成する)値、およびバケット構造は、常に比較的密集した形で連続したメモリに保持されますか?アロケータを使用したハッシュマップの効率的なシリアライゼーションと逆シリアル化

もしそうなら、このようなアロケータを使用してマップを保存して復元することができます。明示的なシリアライズの必要がなく、キーを反復してから挿入します。

もしそうでなければ、逆シリアル化中に各キーを再ハッシングする必要がないハッシュマップを直列化および逆シリアル化する別の方法がありますか?

答えて

2

(標準アロケータを構成することによって、いっそのか、)カスタムアロケータ

はい

を使用する簡単な方法があります

ませ

を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)); 
} 
0

逆方向の二重リンクリストアロケータ。前の前の次のポイントと前のポイントの前のポイント(3Dで反転した蓮(プログラムではない)を想像してください)。

関連する問題