溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c++中不提倡使用vector的原因

發(fā)布時(shí)間:2021-07-26 14:18:39 來源:億速云 閱讀:169 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了c++中不提倡使用vector的原因,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

vector< bool> 并不是一個(gè)STL容器,不是一個(gè)STL容器,不是一個(gè)STL容器!

首先vector< bool> 并不是一個(gè)通常意義上的vector容器,這個(gè)源自于歷史遺留問題。
早在C++98的時(shí)候,就有vector< bool>這個(gè)類型了,但是因?yàn)楫?dāng)時(shí)為了考慮到節(jié)省空間的想法,所以vector< bool>里面不是一個(gè)Byte一個(gè)Byte儲(chǔ)存的,它是一個(gè)bit一個(gè)bit儲(chǔ)存的!

因?yàn)镃++沒有直接去給一個(gè)bit來操作,所以用operator[]的時(shí)候,正常容器返回的應(yīng)該是一個(gè)對(duì)應(yīng)元素的引用,但是對(duì)于vector< bool>實(shí)際上訪問的是一個(gè)”proxy reference”而不是一個(gè)”true reference”,返回的是”std::vector< bool>:reference”類型的對(duì)象。

而一般情況情況下

vector< bool> c{ false, true, false, true, false }; 
bool b = c[0]; 
auto d = c[0];

對(duì)于b的初始化它其實(shí)暗含了一個(gè)隱式的類型轉(zhuǎn)換。而對(duì)于d,它的類型并不是bool,而是一個(gè)vector< bool>中的一個(gè)內(nèi)部類。

而此時(shí)如果修改d的值,c中的值也會(huì)跟著修改:

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

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

而為什么說vector< bool>不是一個(gè)標(biāo)準(zhǔn)容器,就是因?yàn)樗荒苤С忠恍┤萜髟撚械幕静僮?,諸如取地址給指針初始化操作:

vector< bool> c{ false, true, false, true, false }; 
&tmp = c[0]; //錯(cuò)誤,不能編譯,對(duì)于引用來說,因?yàn)閏[0]不是一個(gè)左值 
bool *p = &c[0]; //錯(cuò)誤,不能編譯,因?yàn)闊o法將一個(gè)臨時(shí)量地址給綁定到指針

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“c++中不提倡使用vector的原因”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI