做爲一個STL容器,vector<bool>僅僅有兩點不正確。數組
首先。它不是一個STL容器。函數
其次,它並不存儲bool。除此以外。一切正常。spa
一個對象要成爲容器,就必須知足C++標準中列出的所有條件。當中一個條件是,假設c是包括對象T的容器,而且c支持operator[],那麼如下的代碼必須能夠被編譯:設計
T *p = &c[0];指針
換句話說。假設用operator[]取得了container<T>中的一個T對象。那麼就可以經過取它的地址獲得一個指向該對象的指針。因此,假設vector<bool>是一個容器。那麼如下這段代碼必須可以被編譯:orm
vector<bool> v;對象
bool *pb = &v[0];接口
但是它不能編譯。不能編譯的緣由是。vector<bool>是一個假的容器,它並不真的存儲bool,相反,爲了節省空間,它存儲的是bool的緊湊表示。在一個典型的實現中,存儲在「vector」中的每個「bool」僅佔一個二進制位,一個8位的字節可容納8個「bool」。ip
在內部,vector<bool>使用了與位域同樣的思想,來表示它所存儲的那些bool。實際上它僅僅是僞裝存儲了這些bool。內存
位域與bool類似。它僅僅能表示兩個可能的值,但是在bool和看似bool的位域之間有一個很是重要的差異:咱們可以建立一個指向bool的指針,而指向單個位的指針則是不一樣意的。指向單個位的引用也是被禁止的,這使得在設計vector<bool>的接口時產生了一個問題。因爲vector<T>::operator[]的返回值應該是T&.假設vector<bool>中所存儲的確實是bool。那麼這就不是問題。但因爲實際上並非如此,因此vector<bool>::operator[]需要返回一個指向一個單個位的引用,而這種引用並不存在。
當咱們需要vector<bool>時,咱們有兩種選擇可以作:
用deque<bool>。deque差點兒提供了vector所提供的一切(可以看到的省略僅僅有reserve和capacity),但deque<bool>是一個STL容器,而且它確實存儲bool。固然,deque中元素的內存不是連續的,因此你不能把deque<bool>中的數據傳遞給一個指望bool數組的C API,但對於vector<bool>,咱們也不能這麼作,因爲沒有一種可移植的方法能夠獲得vector<bool>中的數據。
選擇bitset。bitset不是STL容器,但它是標準C++庫的一部分。
與STL容器不一樣的是,它的大小(即元素的個數)在編譯時就肯定了,因此它不支持插入和刪除元素。而且,因爲它不是一個STL容器。因此它不支持迭代器。但是。與vector<bool>同樣。它使用了一種緊湊表示。僅僅爲所包括的每個值提供一個空間。它提供了vector<bool>特有的flip成員函數,以及其餘一些特有的、對位的集合有意義的成員函數。