避免使用vector bool

2021-09-08 12:49:21 字數 1260 閱讀 9486



作為乙個stl容器,vector僅僅有兩點不正確。

首先。它不是乙個stl容器。

其次,它並不儲存bool。除此之外。一切正常。

乙個物件要成為容器,就必須滿足c++標準中列出的全部條件。當中乙個條件是,假設c是包括物件t的容器,並且c支援operator,那麼以下的**必須可以被編譯:

t *p = &c[0];

換句話說。假設用operator取得了container中的乙個t物件。那麼就能夠通過取它的位址得到乙個指向該物件的指標。所以,假設vector是乙個容器。那麼以下這段**必須能夠被編譯:

vectorv;

bool *pb = &v[0];

可是它不能編譯。不能編譯的原因是。vector是乙個假的容器,它並不真的儲存bool,相反,為了節省空間,它儲存的是bool的緊湊表示。在乙個典型的實現中,儲存在「vector」中的每乙個「bool」僅佔乙個二進位制位,乙個8位的位元組可容納8個「bool」。

在內部,vector使用了與位域一樣的思想,來表示它所儲存的那些bool。實際上它僅僅是假裝儲存了這些bool。

位域與bool相似。它僅僅能表示兩個可能的值,可是在bool和看似bool的位域之間有乙個非常重要的差別:我們能夠建立乙個指向bool的指標,而指向單個位的指標則是不同意的。指向單個位的引用也是被禁止的,這使得在設計vector的介面時產生了乙個問題。由於vector::operator的返回值應該是t&.假設vector中所儲存的確實是bool。那麼這就不是問題。但由於實際上並不是如此,所以vector::operator須要返回乙個指向乙個單個位的引用,而這種引用並不存在。

當我們須要vector時,我們有兩種選擇能夠做:

用deque。

deque差點兒提供了vector所提供的一切(能夠看到的省略僅僅有reserve和capacity),但deque是乙個stl容器,並且它確實儲存bool。當然,deque中元素的記憶體不是連續的,所以你不能把deque中的資料傳遞給乙個期望bool陣列的c api,但對於vector,我們也不能這麼做,由於沒有一種可移植的方法可以得到vector中的資料。

選擇bitset。

bitset不是stl容器,但它是標準c++庫的一部分。

與stl容器不同的是,它的大小(即元素的個數)在編譯時就確定了,所以它不支援插入和刪除元素。並且,由於它不是乙個stl容器。所以它不支援迭代器。可是。與vector一樣。它使用了一種緊湊表示。僅僅為所包括的每乙個值提供乙個空間。它提供了vector特有的flip成員函式,以及其他一些特有的、對位的集合有意義的成員函式。

部落格20 避免使用vector bool

內容 記錄下今天覆習下以前看過的effective stl中的第18條建議,不要使用vector。因為它其實並不儲存bool。而且它不屬於容器,乙個物件是不是容器,並不是你能用容器語法定義出來的就一定是容器,書中講到c 標準規定乙個stl容器需要滿足的其中乙個條件就是 如果c是包含物件t的乙個容器,...

10 避免使用with

程式經常需要對單個物件依次呼叫一系列方法。function status info 複製 function f x,y 複製 變數作用域和物件命名空間之間的衝突使得with 塊異常脆弱。error status connecting status connecting widget.prototyp...

有效避免使用遞迴

例項 自動化指令碼管理工具,資料儲存在伺服器,讀到客戶端後,需要建立乙個資料結構,從上到下順序為 folder object control operation parameter folder object operation parameter folder case caseprocess p...