C++ 将 dynamic_bitset 存储到文件中

标签 c++ vector binaryfiles bloom-filter boost-dynamic-bitset

跟进 How does one store a vector<bool> or a bitset into a file, but bit-wise?

基本上,我使用以下代码将位集编写为二进制文件:

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的方法变成一个临时 vector ,然后打印出 block 到文件中。它有效,但当我使用中间 vector 时,我的内存使用量加倍(使用的 vector 与我的位集大小相同)。如何在不增加内存使用量的情况下将位集打印到文件?

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

最佳答案

你应该手动完成。迭代这些位,将它们打包成 unsigned char s 和 stream.put将字符放入文件中。

直接写原生block_type导致文件格式依赖于平台特定的字节顺序,这通常是不可取的。 (并将 block_type 设置为 char 会损害性能。)

看看您的其他问题,我发现这与 Nawaz 的建议相同,您可能想返回使用 std::vector<bool>相反。

关于C++ 将 dynamic_bitset 存储到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504314/

相关文章:

c++ - 如何在运行时将字符串转换为代码

c++单例,奇怪的错误

c++ - 使用模板化运算符<<输出集合的集合

c++ - 迷宫生成 vector 分割错误

c++ - vector 的数据如何对齐?

swift - 以 1024 字节为单位读取大型二进制数据文件

c++ - 从内存 C++ 中读取位,移位并存储

c++: vector 没有命名类型

bash - 使用 bash : write bit representation of integer to file

c - 在 C 中查找 ELF 二进制文件的 dlopen 调用次数