【问题标题】:C++ Storing a dynamic_bitset into a fileC ++将dynamic_bitset存储到文件中
【发布时间】:2012-11-10 08:33:29
【问题描述】:

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

基本上我正在使用以下代码将 bitset 编写为二进制文件:

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 的作者故意省略了这种功能。我应该使用不同的数据结构吗?如果对上下文有帮助,我将在一些布隆过滤器代码中使用位集。

【问题讨论】:

  • @Potatoswatter 是的。我应该更清楚。

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


【解决方案1】:

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

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

查看您的另一个问题,我发现这与 Nawaz 的建议相同,您可能想改用 std::vector&lt;bool&gt;

【讨论】:

    猜你喜欢
    • 2017-01-14
    • 2021-12-09
    • 2021-03-17
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多