转:STL:string 大小(Size)和容量(Capacity)
strings存在三種“大小”:
1、size()和length()
返回string中現(xiàn)在的字符個(gè)數(shù)。上述兩個(gè)函數(shù)等效。
成員函數(shù)empty()用來(lái)檢驗(yàn)字符數(shù)是否為0,亦即字符串是否為空。你應(yīng)該優(yōu)先使用該函數(shù),因?yàn)樗萳ength()或size()來(lái)得快。
也就是說(shuō),使用if(s.empty()?==?true)而不使用if(s.size()?==?0)(筆者注)
2、max_size()
此函數(shù)返回一個(gè)string最多能夠包含的字符數(shù)。一個(gè)string通常包含一塊單獨(dú)內(nèi)存區(qū)塊內(nèi)的所有字符,所以可能跟PC機(jī)器本省的限制有關(guān)系。返回值一般而言是索引型別的最大值減1。之所以“減1”有兩個(gè)原因:(a)最大值本身是npos;(b)在具體實(shí)現(xiàn)中,可因此輕易在內(nèi)部緩沖區(qū)之后添加一個(gè)'\0',以便將這個(gè)string當(dāng)做C-string使用(例如透過(guò)c_str())。一旦某個(gè)操作函數(shù)使用一個(gè)長(zhǎng)度大于max_size()的string,length_error異常就會(huì)被拋出來(lái)。
3、capacity()
重新分配內(nèi)存之前,string所能包含的最大字符數(shù)。
讓string擁有足夠的容量是很重要的,原因有二:
1、重新分配會(huì)造成所有指向string的references,pointer和iterators失效。
2、重新分配(reallocation)很耗時(shí)間。
因此,如果程序要用到指向string(或其內(nèi)部字符)的references,pointers和iterators。抑或需要很快的執(zhí)行速度,就必須考慮容量(capacity)問(wèn)題。成員函數(shù)reserve()就是用來(lái)避免重分配行為。reserve()使你得以預(yù)留一定容量,并確保該容量尚有余裕之時(shí),reference能夠一直保持有效:
std::string?s;?//?create?empty?string
s.reserve(80);?//?reserve?memory?for?80?characters
容量概念應(yīng)用于string和應(yīng)用于vector是相同的,但有一個(gè)顯著差異:面對(duì)string你可以調(diào)用reserve()來(lái)縮減實(shí)際容量,而vector的reserve()卻沒(méi)有這項(xiàng)功能。拿一個(gè)“小于現(xiàn)有容量”的參數(shù)來(lái)調(diào)用reserve(),實(shí)際上就是一種非強(qiáng)制性請(qǐng)求(nonbinding?shrink?request)——如果參數(shù)小于現(xiàn)有字符數(shù),則這項(xiàng)請(qǐng)求被視為非強(qiáng)制性適度縮減請(qǐng)求(nonbinding?shrink-to-fit-requset)。也就是說(shuō)你可能想要縮減容量至某個(gè)目標(biāo),但不保證你一定可以如愿。String的reserve()參數(shù)做默認(rèn)值為0,所以調(diào)用reserve()并且不給參數(shù),就是一種“非強(qiáng)制性適度縮減請(qǐng)求”:
s.reserve();?//?"would?like?to?shrink?capacity?to?fit?the?current?size"
為什么縮減動(dòng)作是非強(qiáng)制性的呢?因?yàn)?#34;如何獲取最佳性能"系由實(shí)現(xiàn)者定義。具體實(shí)作string時(shí),如何處理速度和內(nèi)存耗用量之間關(guān)系可能有不同的設(shè)計(jì)思路。因此任何實(shí)作作品都可以以較大的魄力增加容量,并且永不縮減。
C++Standard規(guī)定,唯有在相應(yīng)reserve()調(diào)用時(shí),容量才可能縮減。因此即使發(fā)生?"字符被刪除或被改變"的事情,任何其他字符只要位于“被操作字符”之前,指向他們身上的那些references、pointer和iterator就仍然保持有效。
備注:本文內(nèi)容摘自《C++標(biāo)準(zhǔn)程序庫(kù)》(侯捷?孟巖譯)
轉(zhuǎn)載于:https://www.cnblogs.com/cchun/archive/2012/06/27/2564573.html
總結(jié)
以上是生活随笔為你收集整理的转:STL:string 大小(Size)和容量(Capacity)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WebBrowser页面与WinForm
- 下一篇: C#委托-委托不关心被封装的类