Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运营商>&燃气轮机;不';t喜欢向量<;bool>;?_C++_File_Vector_Boolean_Ifstream - Fatal编程技术网

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;
cout
vector
并不是你所想的那样。它是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++;
}