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();

我使用动态bitset和to_block_range的方法变成一个临时向量,然后将块打印到文件中。它有效,但是当我使用中间向量(使用的向量与我的位集大小相同)时,我的内存使用量增加了一倍。如何在不增加内存使用量的情况下将 bitset 打印到文件中?

如果我能以块的形式遍历 bitset,那就太好了,但似乎为了防止其他一些问题,动态 bitset 的作者故意省略了这种功能。我应该使用不同的数据结构吗?如果它有助于上下文,我将在一些布隆过滤器代码中使用位集。

4

1 回答 1

1

您应该手动进行。遍历这些位,将它们打包到unsigned chars 中,然后stream.put将字符打包到文件中。

直接编写本block_type机会导致文件格式依赖于特定于平台的字节序,这通常是不可取的。(设置block_typechar会损害性能。)

查看您的另一个问题,我发现这与 Nawaz 的建议相同,您可能想重新使用std::vector<bool>

于 2012-11-22T01:24:30.707 回答