国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

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

2020-01-26 13:25:30
字體:
來源:轉載
供稿:網友

前言

起因是這樣的,昨天在查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<bool> c{ false, true, false, true, false };bool b = c[0];auto d = c[0];

對于b的初始化它其實暗含了一個隱式的類型轉換。而對于d,它的類型并不是bool,而是一個vector< bool>中的一個內部類。

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

d = true;for(auto i:c)  cout<<i<<" ";cout<<endl;//上式會輸出1 1 0 1 0

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

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

vector<bool> c{ false, true, false, true, false };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推導出意外的類型時,使用顯式的類型初始化語義

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 呼伦贝尔市| 许昌县| 临泉县| 宝坻区| 类乌齐县| 富民县| 喜德县| 瓮安县| 柳河县| 大田县| 湘乡市| 南平市| 佛冈县| 土默特右旗| 肇州县| 芜湖县| 安国市| 吉木乃县| 银川市| 恩施市| 怀化市| 凉城县| 汉源县| 成安县| 蓬莱市| 金平| 耿马| 桓仁| 方山县| 扶余县| 广河县| 林周县| 农安县| 辽阳县| 循化| 宁城县| 洪湖市| 清水县| 云林县| 故城县| 柳河县|