如何在二进制文件中转储std :: vector <bool>?</bool>

时间:2015-04-14 09:19:52

标签: c++ boolean stdvector

我编写了一些小工具来转储和加载二进制文件中的公共对象。在第一个快速实现中,我为std::vector<bool>编写了以下代码。它有效,但显然没有在内存中进行优化。

template <>
void binary_write(std::ofstream& fout, const std::vector<bool>& x)
{
    unsigned long int n = x.size();
    fout.write((const char*)&n, sizeof(unsigned long int));
    for(unsigned long int i = 0; i < n; ++i)
    {
        bool xati = x.at(i);
        binary_write(fout, xati);
    }
}

template <>
void binary_read(std::ifstream& fin, std::vector<bool>& x)
{
    unsigned long int n;
    fin.read((char*)&n, sizeof(unsigned long int));
    x.resize(n);
    for(unsigned long int i = 0; i < n; ++i)
    {
        bool xati;
        binary_read(fin, xati);
        x.at(i) = xati;
    }
}

如何在我的信息流中复制std::vector<bool>的内部存储空间?

注意: 我不想用其他内容替换 std::vector<bool>

2 个答案:

答案 0 :(得分:1)

很抱歉,答案是你无法移植。

要以非移植方式执行此操作,您可以编写特定于标准库实现的vector<bool>迭代器的函数。

如果您很幸运,相关字段将在迭代器中公开,因此您不必将私人更改为公开。

答案 1 :(得分:1)

回答我自己的问题,目前已被证实为最佳答案,但如果有人提供更好的答案,它可能会改变。

这样做的方法如下。它需要访问每个值,但它可以工作。

template <>
void binary_write(std::ofstream& fout, const std::vector<bool>& x)
{
    std::vector<bool>::size_type n = x.size();
    fout.write((const char*)&n, sizeof(std::vector<bool>::size_type));
    for(std::vector<bool>::size_type i = 0; i < n;)
    {
        unsigned char aggr = 0;
        for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
            if(x.at(i))
                aggr |= mask;
        fout.write((const char*)&aggr, sizeof(unsigned char));
    }
}

template <>
void binary_read(std::ifstream& fin, std::vector<bool>& x)
{
    std::vector<bool>::size_type n;
    fin.read((char*)&n, sizeof(std::vector<bool>::size_type));
    x.resize(n);
    for(std::vector<bool>::size_type i = 0; i < n;)
    {
        unsigned char aggr;
        fin.read((char*)&aggr, sizeof(unsigned char));
        for(unsigned char mask = 1; mask > 0 && i < n; ++i, mask <<= 1)
            x.at(i) = aggr & mask;
    }
}