###《Effective STL》--Chapter2
點(diǎn)擊查看Evernote原文。
#@author: gr #@date: 2014-09-15 #@email: forgerui@gmail.comChapter2 vector和string
Topic 15: 注意string實(shí)現(xiàn)的多樣性
string可能有多種不同的實(shí)現(xiàn)。文中介紹了四種,由于采用不同的實(shí)現(xiàn),使用sizeof(string)計(jì)算會(huì)得到不同的值。
在這四種實(shí)現(xiàn)中,string對(duì)象的大小可以是一個(gè)char*指針大小的1到7倍。并且,各種實(shí)現(xiàn)的動(dòng)態(tài)內(nèi)存分配也不盡相同,可能需要1到2次的動(dòng)態(tài)內(nèi)存分配。
例子 :
其中一種實(shí)現(xiàn)提供了對(duì)小字符串的性能優(yōu)化。首先,這個(gè)string占據(jù)了7倍char*的空間,是實(shí)現(xiàn)中空間最大的,其中有4倍空間是用來(lái)存儲(chǔ)字符,最多15個(gè)字符,這樣當(dāng)字符小于16個(gè)時(shí),不需要?jiǎng)討B(tài)分配內(nèi)存;如果,超過(guò)15個(gè)字符,則會(huì)動(dòng)態(tài)分配內(nèi)存,并將地址存儲(chǔ)在x4空間的頂端。
Topic 17: 使用swap技巧除去多余的容量
vector使用reserve預(yù)先申請(qǐng)空間時(shí),可能申請(qǐng)的很大,如何去除多余的空間呢。使用swap技巧可以有效解決這個(gè)問(wèn)題。用已有vector去初始化一個(gè)臨時(shí)向量,并進(jìn)行交換,最后交換后臨時(shí)向量被析構(gòu)(先前的已有向量)。注意,這里的除去多余容量不是全部空余向量,因?yàn)榫幾g器可能保持一些空間以保證空間為2的乘冪數(shù)。
同樣,也可以使用swap技巧去清空vector和string。
Topic 18: 避免使用vector<bool>
使用vector<bool>可能和你期望得到的結(jié)果不同,它不能稱(chēng)得上真正的容器。一般取得一個(gè)容器元素的地址會(huì)返回一個(gè)指向容器中元素類(lèi)型的指針,而vector<bool>卻是返回一個(gè)代理對(duì)象。
原因在于,vector<bool>采用緊湊型存儲(chǔ),即一個(gè)bool只占用一位(bit)。一個(gè)8位的字節(jié)(byte)可以存放8個(gè)bool,那么返回的指針會(huì)指向單個(gè)位,而指向單個(gè)位(bit)是被禁止的,為了避免這個(gè)問(wèn)題,會(huì)用一個(gè)代理對(duì)象包裝,所以會(huì)莫名其妙地產(chǎn)生一個(gè)新的對(duì)象。
解決方法:
- 使用deque<bool>,deque確實(shí)存儲(chǔ)bool。
- 使用bitset,bitset使用緊湊表示,無(wú)法動(dòng)態(tài)增刪。
轉(zhuǎn)載于:https://www.cnblogs.com/gr-nick/p/3979842.html
總結(jié)
以上是生活随笔為你收集整理的###《Effective STL》--Chapter2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 多线程下的集合安全
- 下一篇: Eclipse 集成gtk开发环境