4

ベクトル<bool>またはビットセットをファイルに保存するにはどうすればよいですか?

基本的に、私は次のコードでバイナリファイルとしてビットセットを書いています:

boost::dynamic_bitset<boost::dynamic_bitset<>::block_type> filter;
vector<boost::dynamic_bitset<>::block_type> filterBlocks(filter.num_blocks());

//populate vector blocks
boost::to_block_range(filter, filterBlocks.begin());

ofstream myFile(filterFilePath.c_str(), ios::out | ios::binary);

//write out each block
for (vector<boost::dynamic_bitset<>::block_type>::iterator it =
        filterBlocks.begin(); it != filterBlocks.end(); ++it)
{
    //retrieves block and converts it to a char*
    myFile.write(reinterpret_cast<char*>(&*it),
            sizeof(boost::dynamic_bitset<>::block_type));
}
myFile.close();

動的ビットセットとto_block_rangeを一時的なベクトルに変換し、ブロックをファイルに出力する方法を使用しました。動作しますが、中間ベクトルを使用するとメモリ使用量が2倍になります(使用されるベクトルはビットセットと同じサイズです)。メモリ使用量を2倍にすることなく、ビットセットをファイルに出力するにはどうすればよいですか?

ブロック単位でビットセットを反復処理できればいいのですが、他の問題を防ぐために、動的ビットセットの作成者はこの種の機能を意図的に省略したようです。別のデータ構造を使用する必要がありますか?コンテキストに役立つ場合は、ブルームフィルターコードでビットセットを使用しています。

4

1 に答える 1

1

手動で行う必要があります。ビットを繰り返し処理し、それらをunsigned charsにパックしstream.put、charsをファイルにパックします。

ネイティブを直接書き込むblock_typeと、ファイル形式がプラットフォーム固有のエンディアンに依存するようになりますが、これは一般的に望ましくありません。(そして、に設定block_typeするcharとパフォーマンスが低下します。)

他の質問を見ると、これはNawazが提案したものと同じであり、std::vector<bool>代わりに使用に戻りたいと思うかもしれません。

于 2012-11-22T01:24:30.707 に答える