0

我需要实现一个布尔数据容器来存储相当多的变量。我想我可以只使用char*和实现 C 风格的宏访问器,但我更愿意将它包装在一个std::结构中。std::bitset<size_t>似乎不实用,因为它在编译期间具有固定大小。

这样我就可以使用std::vector<bool>针对空间进行优化的了;它有一个很好的类似布尔的访问器。

  1. 有没有办法做一些事情,比如直接从它提供一个指针到fwrite()

  2. 以及如何将文件输入到这样的向量中?

  3. 最后,当需要大量文件 I/O 时,它是一个好的数据结构吗?

  4. 随机文件访问(fseek等)呢?

编辑:我决定将 a 包装std::vector<unsigned int>在一个具有我要求的功能的新类中。

4

2 回答 2

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 等)呢?

怎么样?

于 2013-05-14T13:15:41.763 回答
2

您可以使用 a std::vector<char>,将其调整为文件的大小(或其他大小,例如您要处理固定长度的块),然后您可以将其内容传递给类似fread()fwrite()以下方式的函数:

std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);

这实际上只允许您以 C++ 风格拥有一个可调整大小的 char 数组。也许这是一个有用的起点?关键是您可以直接访问向量后面的内存,因为它保证按顺序排列,就像数组一样。

相同的概念适用于 a std::vector<bool>- 我只是在fread进入这个问题时要小心,因为我无法告诉你 a 有多大(sizeof明智)bool,因为它取决于平台(8bit vs 16bit vs 32 位,例如,如果您正在使用微控制器)。

似乎可以优化以将每个布尔值存储在一个位中,因此,除非您知道它会起作用,否则std::vector<bool>绝对不要尝试直接使用 a 后面的内存!vector<bool>

于 2013-05-14T12:11:59.707 回答