2013-05-09 64 views
2

我有以下代碼基本上需要一個向量並將其寫入文件,然後打開文件並將內容寫入不同的向量。運營商>>不喜歡矢量<bool>?

#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; 
} 

我注意到的是,該代碼編譯,並與當載體包含雙,int和長數據類型沒有問題的運行,但如果它更改爲布爾產生一個錯誤。這是我得到的錯誤消息:

../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

您發佈的代碼中沒有'vector '。 – 2013-05-09 19:37:23

+0

我相信一個布爾變量的大小爲1位。所以一個轉變將無所作爲。 Check @Chris我錯了,當它清楚地說出字節時,將規範讀爲位。 – Nomad101 2013-05-09 19:37:32

+4

@ Nomad101,變量必須至少有一個字節。 – chris 2013-05-09 19:37:55

回答

6

std::vector<bool>是專門有空間效率。 operator[]將無法​​返回可尋址變量,因此它會返回代理對象std::vector<bool>::reference。只需將其輸入到一個臨時變量並轉移它:

bool b; 
while (ifile >> b) { 
    p[i] = b; 
    cout <<i<<"\t"<<b<<endl; 
    i++; 
} 
+0

謝謝克里斯。這解決了這個問題。 :) – ipluto 2013-05-09 19:55:42

1

vector<bool>是不是你想象的那樣。它是std :: vector的專門化,針對空間進行了優化,而不針對元素進行操作,試圖通過使用位來表示bool值來減少存儲空間。當使用位時,流操作符不能再工作。

here用於優化的重要的結果:

  • 存儲不一定是布爾值的陣列,但是,使每個值被存儲在單個 庫實現可以優化存儲位。
  • 元素不是使用分配器對象構造的,但它們的值直接設置在內部存儲器的適當位上。
  • 成員函數翻轉和成員交換的新簽名。
  • 一種特殊的成員類型引用,該類訪問容器內部存儲器中的各個位,並使用 模擬bool引用的接口。相反,成員類型const_reference是 一個普通的布爾。
  • 容器使用的指針和迭代器類型不一定非指針也不符合迭代器,儘管它們將模擬大部分預期的行爲。

還有就是你可以使用int這樣一來,如果你知道你有多少bool值在編譯時另一個數據結構:bitset

它定義了流運營商,這是你是什麼指着。

+0

感謝您的詳細解釋。它絕對有我需要學習的東西。 – ipluto 2013-05-09 19:56:21

+0

@ipluto沒問題:) – tmaric 2013-05-09 19:58:05