【问题标题】:How do I serialise/deserialise a std::vector<bool> most efficiently?如何最有效地序列化/反序列化 std::vector<bool> ?
【发布时间】:2019-12-10 13:13:19
【问题描述】:

我正在尝试将std::vector&lt;bool&gt; 的内容写入磁盘到二进制文件中。由于许多 STL 输出流的 write() 方法接受指向数组本身的指针,以及要写入的字节数,对于“正常”向量,我最终会做这样的事情:

std::vector<unsigned int> dataVector = {0, 1, 2, 3, 4};
std::fstream outStream = std::fstream("vectordump.bin", std::ios::out | std::ios::binary);
outStream.write((char*) dataVector.data(), dataVector.size() * sizeof(unsigned int));
outStream.close();

但是,std::vector&lt;bool&gt; 是一种特殊情况,因为 STL 实现允许将布尔值打包成单个位。因此,上述方法在技术上将无法始终如一地工作,因为未指定数据在内存中的精确布局方式。

有什么方法可以序列化/反序列化我的 bool 向量而无需打包/解包数据?

【问题讨论】:

  • 解决方案似乎不是最好的,但我曾经用整数制作了一个辅助向量,并使用整数向量进行写入/读取。你使用哪个值来表示真假取决于你,但我认为有一些简单的选项可以使用;)
  • 即使unsigned int 也可能有不同的大小,并且字节序可能因平台而异...
  • 最简单的解决方案似乎一开始就没有使用布尔向量......

标签: c++ c++11 stl


【解决方案1】:

我认为你最好将该向量翻译成std::vector&lt;std::byte&gt;/std::vector&lt;unsigned char&gt;

std::vector&lt;bool&gt; 甚至不需要有连续的内存,所以从data() 开始写入也是实现定义的。

【讨论】:

  • 很高兴知道,谢谢!我想我最好的选择是自己手动实现一个打包位向量,这样我就可以确定它包含的数据类型。
【解决方案2】:

不,没有。

对不起。

避免使用这个容器的好理由!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-03-23
    相关资源
    最近更新 更多