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