C++ 运营商>&燃气轮机;不';t喜欢向量<;bool>;?
我有下面的代码,它基本上获取一个向量并将其写入一个文件,然后打开该文件并将内容写入另一个向量C++ 运营商>&燃气轮机;不';t喜欢向量<;bool>;?,c++,file,vector,boolean,ifstream,C++,File,Vector,Boolean,Ifstream,我有下面的代码,它基本上获取一个向量并将其写入一个文件,然后打开该文件并将内容写入另一个向量 #include <fstream> #include <iostream> #include <vector> using namespace std; int main() { vector<bool> q, p; // ^^^^ q.resize(5, 0); q[0] = 1; q[2] = 1;
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<bool> q, p;
// ^^^^
q.resize(5, 0);
q[0] = 1;
q[2] = 1;
q[4] = 1;
ofstream ofile("file.log");
for (int i = 0; i<5; i++)
ofile <<q[i]<<" ";
ofile.close();
ifstream ifile("file.log");
p.resize(5);
int i = 0;
// vvvvvvvvvvvv
while(ifile>> p[i])
{
cout <<i<<"\t"<<p[i]<<endl;
i++;
}
ifile.close();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量q,p;
// ^^^^
q、 调整大小(5,0);
q[0]=1;
q[2]=1;
q[4]=1;
文件流(“file.log”);
for(int i=0;i专门用于空间效率。运算符[]
将无法返回可寻址变量,因此它将返回代理对象。只需将其输入到临时变量并传输:
bool b;
while (ifile >> b) {
p[i] = b;
cout <<i<<"\t"<<b<<endl;
i++;
}
bool-b;
而(i文件>>b){
p[i]=b;
coutvector
并不是你所想的那样。它是std::vector的一种专门化,它针对空间而不是元素操作进行了优化,试图通过使用位来表示bool
值来减少bool
存储。当使用位时,流操作符无法再工作
对于优化的重要结果,Se:
- 存储不一定是bool值的数组,但是库实现可以优化存储,以便每个值都是
存储在单个位中
- 元素不是使用分配器对象构造的,而是直接在内部存储器的适当位上设置它们的值
- 成员函数翻转和成员交换的新签名
- 一种特殊的成员类型,reference,是一个类,它通过一个
模拟布尔引用。相反,成员类型const_引用为
朴素的乡巴佬
- 容器使用的指针和迭代器类型不一定既不是指针也不是一致迭代器,尽管它们是
应模拟其大部分预期行为
如果您知道在编译时有多少bool
值,那么还有另一种数据结构可以通过这种方式使用int:
它定义了流运算符,这正是您的目标。在您发布的代码中没有向量
。我相信bool变量的大小为1位。因此,位移位不会起任何作用。检查@Chris I是错误的,当它清楚地显示byte时,将规范读为bit。@Nomad101,变量必须至少是一个byte。@Chris you a你完全正确。我把说明书看错了,谢谢你给我澄清。@Nomad101:bool
s是一个字节,因为说明书上说没有比这个小的了(学究式地说,没有比这个小的了)。臭名昭著地利用了vector
,它确实为每个bool使用一位,以字节大小的块分配。这是一件非常糟糕的事情,因为在std
容器中出现了令人惊讶的行为,偶尔会引起挫折。谢谢你,克里斯。这解决了问题。:)谢谢你的详细解释。它肯定有我要学的东西。
bool b;
while (ifile >> b) {
p[i] = b;
cout <<i<<"\t"<<b<<endl;
i++;
}