我需要实现一个存储相当大量变量的布尔数据容器。我想我可以使用char*
并实现C风格的宏访问器,但我更希望将它包装在std::
结构中。 std::bitset<size_t>
似乎不实用,因为它具有固定的编译时大小。
这样我就可以使用std::vector<bool>
来优化空间;它有一个很好的bool式存取器。
有没有办法直接将指针从它传送到fwrite()
?
如何将输入文件输入到这样的向量中?
最后,当需要大量文件I / O时,它是一个很好的数据结构吗?
如何随机文件访问(fseek
等)?
编辑:我决定将std::vector<unsigned int>
包装在一个新类中,该类具有我的要求所需的功能。
答案 0 :(得分:6)
- 有没有办法直接将指针从它输入到fwrite()?
不,但您可以使用std::fstream
std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
- 如何将输入文件输入到这样的矢量中?
使用std::fstream
std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
- 最后,当需要大量文件I / O时,它是一个很好的数据结构吗?
不,vector<bool>
很少是出于任何目的的良好数据结构。见http://howardhinnant.github.io/onvectorbool.html
- 随机文件访问(fseek等)怎么样?
怎么样?
答案 1 :(得分:2)
您可以使用std::vector<char>
,将其大小调整为文件大小(或其他大小,假设您要处理固定长度的块),然后您可以将其内容传递给类似{{的函数1}}或fread()
以下列方式:
fwrite()
这实际上只允许你使用C ++风格的可调整大小的char数组。也许这是一个有用的起点?关键是你可以直接访问向量后面的内存,因为它保证按顺序排列,就像数组一样。
同样的概念适用于std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);
- 我只是在std::vector<bool>
进入这个问题时要小心,因为我无法告诉你有多大(明智地fread
sizeof
,因为它取决于平台(8位对比16位对比32位,如果您正在使用微控制器)。 击>
似乎可以优化bool
以将每个bool存储在一个位中,因此,除非您知道它将起作用,否则绝对不要尝试直接使用std::vector<bool>
后面的内存! / p>