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 < bool > 的特殊性--為什麼它不是STL容器 - haolexiao的專欄 - 部落格頻道 - CSDN.NET
3樓:
避免使用vector
簡單的說就是它並未實際儲存乙個bool, 而是用位域的概念進行了封裝.
所以你在實際應用的時候可能會發生一些你意料之外的問題.
為什麼不提倡體罰學生?
李濤 路人過馬路闖紅燈,交警多次制止無效,交警能不能打路人?我爸血壓高還常喝酒,我多次勸說無效,我能不能打他?我單位的會計經常把賬算錯,我能不能打她?學校的教師批改試卷批錯了,我能不能打他?如果你覺得不能,那為什麼就能打學生? 大宇宙的總意識 不提倡體罰學生是保護老師,因為你無法承受報復的代價。畢竟...
為什麼不提倡打孩子?
漫漫清歡 嗯 所有有家暴行為的人,都是真正意義上的社會慫人,生活給他們壓力,他們無從反抗,也無處發洩內心的惶恐與怨氣,所以往往把焦躁不安的情緒倒戈向內,用暴力和或冷暴力作踐家人,他想通過暴力控制家庭內成員全部的思想行為,來彰顯自己的家庭地位,並以此獲得外面給不了的尊重與服從,這樣的人可憐之處,是他人...
為什麼不提倡使用紅磚?紅磚的替代產品有哪些?有哪些優缺點好處?
拾光悠然設計小彤 紅磚 又名粘土磚,原料以粘土 煤矸石 頁岩為主,經粉碎 混合捏練用人工或機械壓制成型,待風乾後在900 左右的溫度下燒製而成。不提倡使用紅磚的主要原因是環境的汙染 土質的破壞 資源的減少 複雜的工序。1 燒製紅磚要消耗大量的不可再生資源煤炭,燒煤還會產生大量的有害氣體排放到空氣中,...