C++ 如何使用std::vector进行文件I/O<;bool>;?
我需要实现一个布尔数据容器,它将存储相当多的变量。我想我可以只使用C++ 如何使用std::vector进行文件I/O<;bool>;?,c++,boolean,bit-manipulation,C++,Boolean,Bit Manipulation,我需要实现一个布尔数据容器,它将存储相当多的变量。我想我可以只使用char*并实现C风格的宏访问器,但我更喜欢将其包装在std::结构中标准::位集似乎不实用,因为它在编译期间具有固定的大小 这就给我留下了std::vector,它针对空间进行了优化;它有一个漂亮的布尔式存取器 有没有一种方法可以直接将指针从它馈送到fwrite() 如何将文件输入到这样的向量中 最后,当需要大量的文件I/O时,它是一个好的数据结构吗 那么随机文件访问(fseeketc)呢 编辑:我决定将一个std::vecto
char*
并实现C风格的宏访问器,但我更喜欢将其包装在std::
结构中<代码>标准::位集似乎不实用,因为它在编译期间具有固定的大小
这就给我留下了std::vector
,它针对空间进行了优化;它有一个漂亮的布尔式存取器
fwrite()
fseek
etc)呢编辑:我决定将一个
std::vector
封装在一个新类中,该类具有我的需求所需的功能。您可以使用一个std::vector
,将其大小调整为文件大小(或者其他大小,比如您希望处理固定长度的块),然后您可以将其内容传递给一个类似fread()的函数
或fwrite()
按以下方式:
std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);
std::向量文件内容;
fileContents.resize(100);
fread(&fileContents[0],1100,文件流);
<>这只允许你用C++风格有一个可调整的字符数组。也许这是一个有用的起点?关键是,您可以直接访问向量后面的内存,因为它保证按顺序排列,就像数组一样
同样的概念也适用于std::vector
——我只是在fread
的时候要小心,因为我无法告诉你bool
有多大(sizeof
wise),因为它取决于平台(8位vs 16位vs 32位,如果你在微控制器上工作的话)
似乎可以优化std::vector
以将每个bool存储在一个位中,因此,除非您知道它会工作,否则绝对不要尝试直接使用vector
后面的内存
- 是否有一种方法可以直接将指针从它馈送到fwrite()
std::fstream
std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
- 最后,当需要大量的文件I/O时,它是一个好的数据结构吗
vector
对于任何目的来说都很少是一个好的数据结构。看
- 那么随机文件访问(fseek等)呢
怎么办?这是个好主意-但我没有部署boost,我不确定这样做的成本是否会带来好处。这是vector的一个专门版本,用于bool类型的元素并优化空间。-然而,在下一个公告点上,它指出了“可能”一词,这可能意味着未定义的行为..哇,我不知道STL中的这种优化。。。那我就不用了。对我来说,使用
std::vector
。除非你处理的是GB大小的文件,否则我认为你应该没问题,当然这取决于很多因素,不是吗?不过,你可以使用向量
并使用循环填充它。这不会比使用fread
的效率低,后者可能也会使用循环(我的意思是它可能会使用一些魔法,比如共享内存页或虚拟内存或其他类似的东西,但实际上我认为它只会复制仍然是O(n)的内存)@WayneUroda事实上,这种想要的优化是标准库中最大和最古老的设计缺陷之一(这正是您提出的std::vector
在文件I/O(以及许多其他方面)方面远远优于标准库的原因)。