我有以下代码,它基本上采用向量并将其写入文件,然后打开文件并将内容写入不同的向量。
#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;
}
我注意到,当向量包含double,int和long数据类型时,此代码编译并运行没有问题,但如果将其更改为bool则会产生错误。这是我收到的错误消息:
../src/timeexample.cpp:31: error: no match for ‘operator>>’ in ‘ifile >> p.std::vector<bool, _Alloc>::operator[] [with _Alloc = std::allocator<bool>](((long unsigned int)i))’
那么,有谁知道为什么会这样?
谢谢
答案 0 :(得分:6)
std::vector<bool>
专门用于提高空间效率。 operator[]
无法返回可寻址变量,因此它会返回std::vector<bool>::reference
代理对象。只需将其输入临时变量并传输即可:
bool b;
while (ifile >> b) {
p[i] = b;
cout <<i<<"\t"<<b<<endl;
i++;
}
答案 1 :(得分:1)
vector<bool>
不是你的想法。它是std :: vector的一个特化,它针对空间进行了优化,而不是对元素上的操作进行了优化,试图通过使用位来表示bool
值来表示bool
存储。当使用位时,流操作符不再起作用。
Se here了解优化的重要结果:
- 存储不一定是bool值的数组,但库实现可以优化存储,以便每个值都是 存储在一个位中。
- 元素不是使用allocator对象构造的,但它们的值直接设置在内部存储中的正确位上。
- 会员功能翻转和会员互换的新签名。
- 一个特殊的成员类型,引用,一个访问容器内部存储中各个位的类,其接口是 模拟bool引用。相反,成员类型const_reference是 简单的布尔。
- 容器使用的指针和迭代器类型不一定既不是指针也不是符合迭代器,尽管它们 应模拟他们预期的大多数行为。
如果您知道在编译时有多少bool
个值,则可以使用这种方式使用另一种数据结构:bitset
它定义了流操作符,这是您的目标。