如何将 std::vector<bool> 转储到二进制文件中?
How to dump std::vector<bool> in a binary file?
我编写工具来转储和加载二进制文件中的常见对象。在第一个快速实现中,我为 std::vector<bool>
编写了以下代码。可以用,但是明显没有在内存中优化。
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::vector<bool>
的内存?
注意: 我不想用其他东西替换 std::vector<bool>
抱歉,但答案是您不能以可移植的方式执行此操作。
要以不可移植的方式执行此操作,您可以为 vector<bool>
.
编写一个特定于标准库实现迭代器的函数
如果幸运的话,相关字段将在迭代器中 public,因此您不必将 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::vector<bool>
编写了以下代码。可以用,但是明显没有在内存中优化。
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::vector<bool>
的内存?
注意: 我不想用其他东西替换 std::vector<bool>
抱歉,但答案是您不能以可移植的方式执行此操作。
要以不可移植的方式执行此操作,您可以为 vector<bool>
.
如果幸运的话,相关字段将在迭代器中 public,因此您不必将 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;
}
}