c 中為什麼不提倡使用vector bool ?

時間 2021-06-03 04:30:40

1樓:陌歸

作為乙個 STL 容器,vector 確實只有兩個問題:

1. 它不是乙個STL容器

2. 它並不容納 bool

因為vector 打包 bool 以節省空間,每個儲存在「vector」中的「bool」占用乙個單獨的bit,而禁止有指向單個位元的指標,所以vector不能編譯下式:

vector v; 2 bool *pb = &v[0];  // 使用 vector::operator 返回的東西的位址初始化乙個bool*

標準庫提供了兩個替代品,它們滿足幾乎所有的需求:

1. 第乙個是deque

deque提供了幾乎多有vector所提供的,而且deque 儲存真正的bool值

2. bitset。

2樓:張昭

vector並不是乙個STL容器,不是乙個STL容器,不是乙個STL容器!

首先vector< bool> 並不是乙個通常意義上的vector容器,這個源自於歷史遺留問題。 早在C++98的時候,就有vector< bool>這個型別了,但是因為當時為了考慮到節省空間的想法,所以vector< bool>裡面不是乙個Byte乙個Byte儲存的,它是乙個bit乙個bit儲存的!

因為C++沒有直接去給乙個bit來操作,所以用operator的時候,正常容器返回的應該是乙個對應元素的引用,但是對於vector< bool>實際上訪問的是乙個"proxy reference"而不是乙個"true reference",返回的是"std::vector< bool>:reference"型別的物件。

而一般情況情況下

vector c;

bool b = c[0];

auto d = c[0];

對於b的初始化它其實暗含了乙個隱式的型別轉換。

而對於d,它的型別並不是bool,而是乙個vector< bool>中的乙個內部類。

而此時如果修改d的值,c中的值也會跟著修改

d = true;

for(auto i:c)

cout<

而如果c被銷毀,d就會變成乙個懸垂指標,再對d操作就屬於未定義行為。

而為什麼說vector< bool>不是乙個標準容器,就是因為它不能支援一些容器該有的基本操作,諸如取位址給指標初始化操作

vector c;

&tmp = c[0]; //錯誤,不能編譯,對於引用來說,因為c[0]不是乙個左值

bool *p = &c[0]; //錯誤,不能編譯,因為無法將乙個臨時量位址給繫結到指標 ```

我之前寫過一篇Blog也是講這個的:

談vector &lt; bool &gt; 的特殊性--為什麼它不是STL容器 - haolexiao的專欄 - 部落格頻道 - CSDN.NET

3樓:

避免使用vector

簡單的說就是它並未實際儲存乙個bool, 而是用位域的概念進行了封裝.

所以你在實際應用的時候可能會發生一些你意料之外的問題.

為什麼不提倡體罰學生?

李濤 路人過馬路闖紅燈,交警多次制止無效,交警能不能打路人?我爸血壓高還常喝酒,我多次勸說無效,我能不能打他?我單位的會計經常把賬算錯,我能不能打她?學校的教師批改試卷批錯了,我能不能打他?如果你覺得不能,那為什麼就能打學生? 大宇宙的總意識 不提倡體罰學生是保護老師,因為你無法承受報復的代價。畢竟...

為什麼不提倡打孩子?

漫漫清歡 嗯 所有有家暴行為的人,都是真正意義上的社會慫人,生活給他們壓力,他們無從反抗,也無處發洩內心的惶恐與怨氣,所以往往把焦躁不安的情緒倒戈向內,用暴力和或冷暴力作踐家人,他想通過暴力控制家庭內成員全部的思想行為,來彰顯自己的家庭地位,並以此獲得外面給不了的尊重與服從,這樣的人可憐之處,是他人...

為什麼不提倡使用紅磚?紅磚的替代產品有哪些?有哪些優缺點好處?

拾光悠然設計小彤 紅磚 又名粘土磚,原料以粘土 煤矸石 頁岩為主,經粉碎 混合捏練用人工或機械壓制成型,待風乾後在900 左右的溫度下燒製而成。不提倡使用紅磚的主要原因是環境的汙染 土質的破壞 資源的減少 複雜的工序。1 燒製紅磚要消耗大量的不可再生資源煤炭,燒煤還會產生大量的有害氣體排放到空氣中,...