Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转储std::vector<;布尔>;在二进制文件中?_C++_Boolean_Stdvector - Fatal编程技术网

C++ 如何转储std::vector<;布尔>;在二进制文件中?

C++ 如何转储std::vector<;布尔>;在二进制文件中?,c++,boolean,stdvector,C++,Boolean,Stdvector,我编写工具来转储和加载二进制文件中的公共对象。在第一个快速实现中,我为std::vector编写了以下代码。它可以工作,但显然没有在内存中进行优化 template <> void binary_write(std::ofstream& fout, const std::vector<bool>& x) { std::size_t n = x.size(); fout.write((const char*)&n, sizeof(st

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

template <>
void binary_write(std::ofstream& fout, const std::vector<bool>& x)
{
    std::size_t n = x.size();
    fout.write((const char*)&n, sizeof(std::size_t));
    for(std::size_t 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)
{
    std::size_t n;
    fin.read((char*)&n, sizeof(std::size_t));
    x.resize(n);
    for(std::size_t i = 0; i < n; ++i)
    {
        bool xati;
        binary_read(fin, xati);
        x.at(i) = xati;
    }
}
模板
无效二进制写入(std::ofstream&fout,const std::vector&x)
{
std::size_t n=x.size();
fout.write((const char*)&n,sizeof(std::size_t));
对于(标准::大小\u t i=0;i
如何在流中复制
std::vector
的内部内存?


注意:我不想用其他东西取代
std::vector

很抱歉,但答案是您无法通过便携方式完成此操作

要以不可移植的方式实现这一点,您可以为
vector
编写一个特定于标准库实现的迭代器的函数


如果幸运的话,相关字段在迭代器中是公共的,因此您不必将private更改为public。

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

实现这一点的方法如下。它需要访问每个值,但它可以工作

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;
    }
}
模板
无效二进制写入(std::ofstream&fout,const std::vector&x)
{
std::vector::size_type n=x.size();
fout.write((const char*)&n,sizeof(std::vector::size_type));
对于(std::vector::size_type i=0;i对于(unsigned char mask=1;mask>0&&istd::vector
,我强烈建议您使用类似
std::bitset
boost::dynamic_bitset
的功能,或
ostream
重载
运算符对于二进制存储,r
to_string
?真的吗?^^对,这不是我最聪明的评论;)。不过,在查找std::bitset的功能后,这似乎是唯一的方法(bitset->string->integer某种类型)我很好奇哪一个会更快…嗯,仔细想想,只要坚持使用
std::vector
(参见示例)使数据持久化是序列化程序的工作。无需手工编制。@Klaus:编写具有特定需求的序列化程序是我的工作。我不需要判断问题的相关性。我需要解决方案。;-)事实上,我可以通过在一个字节中设置8个值来实现这一点,并将这个字节存储在我的文件中。但我更喜欢一个好的解决方案。:-@Caduchon:不过,你必须单独访问向量的位。我的观点是你无法避免。这样编写大小不是endian安全的。而且向量的大小是我所使用的std::vector::size\u类型sn不一定与无符号int相同。您是对的,但是现有向量的大小似乎不可能溢出
无符号长int
,因为
无符号长int>=void*>=RAM的大小>=向量的大小
。在这种特定情况下,对位进行计数,然后元素的数量可以大于han是RAM,但模板约束让met认为它是用于所有向量的同一整数类型。在我的例子中,
size\u type
是一个
size\u t
,它是一个64位的uint,与
unsigned long int
相同。这个错误只会发生在具有非常大的布尔向量的假设编译器中。我修改了根据你的评论,我不喜欢使用大小类型来影响范围外的代码(例如,当与来自用户的数据相关时),因为这对于开发人员来说变得非常不清楚。但这里不是这样。