談vector的特殊性 為什麼它不是STL容器

2021-07-27 10:17:15 字數 1137 閱讀 8609

起因是這樣的,昨天在查c++11的range base for loop相關的東西的時候,看到說vector< bool >是乙個proxy iterator,非常的特殊,於是就好奇的研究了一下。

首先vector< bool> 並不是乙個通常意義上的vector容器,這個源自於歷史遺留問題。

早在c++98的時候,就有vector< bool>這個型別了,但是因為當時為了考慮到節省空間的想法,所以vector< bool>裡面不是乙個byte乙個byte儲存的,它是乙個bit乙個bit儲存的!

因為沒有直接去給乙個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

<" ";

cout

所以對於容器一些基本的操作它並不能滿足,諸如取位址給指標初始化操作【因為沒有辦法給單一乙個bit來取位址,或者搞引用】

vector

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

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

所以為什麼說vector< bool>不是乙個標準容器,就是因為它不能支援一些容器該有的基本操作。

what is the correct way of using c++11』s range-based for?

條款6:當auto推導出意外的型別時,使用顯式的型別初始化語義

Flash的特殊性

flash並不是我們想的那是是random accessed.對其進行寫入資料和讀取資料都是得按照一定的規則。比較明顯的一點就是必須先erase再program。否則會產生exception。一般情況下,也就是意味著只有原來的資料是0x.ffff.時才能對其進行程式設計。經過實測,成功。按照一定的規...

ShellExecute使用的特殊性

我這裡想說的是我在使用中遇到的乙個情況 大家都知道,很多程式是安裝到c program files目錄下的,而一般的dos命令,預設空格後面就是要執行的引數。shellexecute中如果使用了絕對路徑,也會出現這個問題。那麼,當如果使用了絕對路徑的時候,如果是執行c program files這樣...

CSS的特殊性 specificity

css的特殊性是非常重要卻又經常被忽視的屬性,特別是在團隊合作下的產品迭代開發中,因為不注重css的特殊性最後導致某些 混亂不堪,這裡就把自己對css特殊性的認識做一些歸納總結.css的特殊性 specificity 也可以稱為css的優先順序或權值 對於每個樣式表規則,瀏覽器都會計算選擇器的特殊性...