2011-04-28 45 views
6

我用operator &=做了一些測試。如以下示例所示,這適用於單個bool類型以及vector<int>類型,但不適用於vector<bool>運算符&=對於元素矢量<bool>未定義?

#include <vector> 
int main(){ 

    bool a, b; 
    a &= b; // ok 
    std::vector<bool> c(1); 
    c[0] &= b; // error 
    c[0] = c[0] & b; // ok 
    std::vector<int> d(1); 
    d[0] &= b; // ok 

    return 0; 
} 

誰能告訴這裏發生了什麼?

(我用gcc 4.4.3)

回答

8

vector<bool> is not a container actually。 :P

文章說

(如果別人寫了矢量,它會被稱爲「不符合」嗯,這是在標準的,這樣就使得它一點點「非標準」。在這一點上更難稱之爲這些名字,但是我們中的一些人無論如何都希望它最終能夠被清理掉,正確的解決方案是去除矢量特化要求,這樣矢量真的是一個普通的老布爾矢量。 ,它主要是多餘的:std :: bitset被設計用於這種事情。) ....

std :: vector的原因是nonconf或者它是在封面下拉動技巧以試圖優化空間:對於每個布爾(至少佔用8倍空間,在具有8位字符的平臺上),而不是存儲完整的char或int,它打包bools並將它們作爲單獨的位(內部,比如字符)存儲在其內部表示中。這樣做的一個後果就是它不能從它的運算符[]或其解除引用的迭代器[2]中返回正常的bool &;相反,它必須與助手「代理」類一起玩遊戲,這類類似布爾型,但絕對不是布爾型。不幸的是,這也意味着訪問一個向量是慢的,因爲我們必須處理代理而不是直接指針和引用。

5

原因是vector<bool>在標準中明確指出每個項目只取一位。

這樣的結果是,operator[]對於vector<bool>返回一個代理對象,而不是像每個其他包含的類型一樣的直接引用。然後代理對象不支持operator&=(儘管我沒有參考,但仍然最有可能按照標準)。

如果您想爲每個項目使用一個字節並讓操作員按預期工作,則可以使用deque<bool>

+0

+1實際回答問題。 – 2011-04-28 17:38:58