青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

huaxiazhihuo

 

stl中string的一種改造

      stl中最難看的組件(沒有之一),無疑就是string這貨了,一百多個成員函數,當然里面大多數是重載的,不必多想,一個class,如果擁有如此之多的函數,必然一定肯定是失敗的,并且,即便是這么一大打函數,string的功能還是很不完備,要不然,就不會有boost里面的string算法。這真是尷尬,string作為最基本最基本的語言組件,又出自官方標準庫,長成這樣子,真是讓無數的c++粉絲要失望,失望歸失望,畢竟師出iso,用起來還是很有保障的,論性能什么,再怎樣,也不會虧到那里去。只是,很讓人好奇的是,這成百個函數又功能不完備的string,里面都有些什么貨色,對此,c++exception系列中有過分析。但是,在此,想探討一下,除了小胡子的方法之外,用其他方法壓縮string的成員函數的數量。
      我們先來看看string的append成員函數,怪怪龍的東,總共有8個重載之多,好像還不止,突然想起狗語言的名言,少即是多,反過來說,多即是少。
basic_string<CharType, Traits, Allocator>& append(
     
const value_type* _Ptr
);
basic_string
<CharType, Traits, Allocator>& append(
     
const value_type* _Ptr,
     size_type _Count
);
basic_string
<CharType, Traits, Allocator>& append(
     
const basic_string<CharType, Traits, Allocator>& _Str,
     size_type _Off,
      size_type _Count
);
basic_string
<CharType, Traits, Allocator>& append(
     
const basic_string<CharType, Traits, Allocator>& _Str
);
basic_string
<CharType, Traits, Allocator>& append(
     size_type _Count, 
     value_type _Ch
);
template
<class InputIterator>
     basic_string
<CharType, Traits, Allocator>& append(
         InputIterator _First, 
           InputIterator _Last
      );
basic_string
<CharType, Traits, Allocator>& append(
        const_pointer _First,
       const_pointer _Last
);
basic_string
<CharType, Traits, Allocator>& append(
        const_iterator _First,
       const_iterator _Last
);
      這么多的重載,其實可分為兩類,一類是迭代器版本的append,對于插入n個相同的字符append,可以看做是特殊迭代器。另一類是連續字節內存塊的append。這里,只關注后一類。雖然有4個之多,但其實只需要一個就行了,那就是 append(const basic_string<CharType, Traits, Allocator>& _Str)。因為字符指針可以隱式轉換為string,另外的兩個重載可以臨時構造string,然后傳遞進append就好了。之所以存在4個,老朽的猜想可能是因為效率,至于調用上的方便性,并沒有帶來多少提高。string的其他類似于用append的通過參數來string的操作,如replace,insert,+=,那么多的重載版本,應該也是同樣的原因。
      假如,臨時string對象的構造沒有造成任何性能上的損失,那么,應該就可以減少幾十個成員函數,這無疑很值得嘗試。那么,能否存在廉價的string臨時構造方法,因為它知道自己是臨時對象,只作為臨時參數傳遞的使命,不會在其上面作什么賦值,添加,修改等操作,也就是說,它是不可變的,那么,這個臨時string對象就不需要分配內存了,只要節用ptr作為自己字符串的起始地址,然后以長度作為自己的長度。參數傳遞使命完成后,也不需要銷毀內存了。
      可是,C++中,也不僅僅是C++,所有的語言并沒有這樣的機制來判斷對象它在構造的時候,就是僅僅作為參數傳遞來使用的。為了達到這種目的,很多時候還不惜使用引用計數,但是,很多場合,臨時string對象始終要構造緩沖存放字符串,比如這里。
除了C++,任何語言的字符串都是不可變的,任何對于字符串的修改,都意味著要創建另一個全新的字符串來,那怕僅僅是修改了一個字符。其實,不可變的字符串,在C++中運用很廣的,很多時候,我們僅僅只需要不可變的字符串,比如說,這里的append,全部只需要immutable的string。只要知道string是immutable的,那么,c++完全可以高效的應付,既然是immutable,就不需要考慮什么資源分配釋放的龜毛問題了。下面,就嘗試class一個immutable的字符串,這,太容易了。就是:
struct Str
{
    typedef 
const char* PCStr;
    PCStr start;
    size_t length;
    Str(PCStr text, size_t len)
    {
        start 
= text;
        length 
= len;
    }
    
//
};
      然后,在basic_string中加入operator Str的函數,以完成從一個string到一個Str的隱式轉換,這個隱式轉換簡直沒有任何性能上的損失。還有,string中再增加一個Sub的成員函數,用于截取一段子字符串,也即是immutable的Str對象。顯然,我們的Str其實表達了一個概念,內存中一節連續的字符內存,也即是數組。
      最后,append就變成append(Str str);了。Str加不加const,或者Str是否為引用,關系都不大。下面,看看它的運作。
對于,append(const char* text),由于Str中有一個const char*參數的構造函數,text自動隱式轉換為一個Str,很好;
對于,append(const char* text,size_t count),用append(Str(text, count)),就地構造一個臨時的Str對象,嗯,語法調用上多了一個Str和一對括號,多了5個字符,的確有點不便。
對于,append(const string& text),同上,string中有一個operator Str的函數,隱式轉換自動完成。
對于,append(const string& text,size_t offset,size_t count),用append(text.Sub(offse, count)),就地構造一個臨時的Str對象,嗯,語法調用上多了一個Sub和一對括號和一個點,但是少了一個逗號,多了5個字符,有點不便。
      即此以推,string中的replace,insert,assign,+=,=等函數,每個平均減少3個,總共差不多可以減少20個左右啦,而功能上沒有任何減少,可喜可賀。
      然后,string中的各種查找比較操作的const的成員函數,比如find,find_first_not_of,rfind等,都可以挪到Str旗下了。因為這些函數,我們也希望可以用之于其他地方,只要那是一塊連續的字符內存好比數組,那么我們就可以就地快速構造一個臨時Str對象,進行find,rfind這些操作了。當然,原來string也可以有這個功能,但是想到僅僅為了做一個find或者find_first_not_of的查找,就要分配內存釋放內存,對于性能優先的巴普洛夫反應的C++猿猴來說,這絕對是望而生畏的大事。現在通過不可變的Str,馬上就釋放出來string的成員函數的隱含的生產力了。 由于Str的廉價和透明性,就可以到處亂使用,想用就用,何其快哉。
      原來string沒有了這些查找的函數,每次要用它們,必須轉換這樣調用,((Str)text).find,無疑很不方便,對此,我們只要在string中再增加一個Str的成員函數,以返回臨時Str對象,就可以text.Str().find(),似乎有點不便,但也不是不能接受。
當然,Str也有缺點,那就是它不以0結束,導致很多對于要求以0結束的地方,就變成禁區了,這坑爹的C語言規定。
      這不是很明顯嗎?字符串的一部分也是字符串,隨便取出字符串的一節,本來就應該是字符串,這么簡明統一簡潔明顯的概念,這樣可以簡化多少代碼呢,結果,偏偏只有帶有0結束的那一節字符串,才是C語言承認的字符串。一個很好的概念,就這樣在很多地方失去用武之地了。你因為以0結束的字符串很好嗎,要不cstring頭文件中也不會有那么多帶有字符串長度版本的字符函數,如strncpy,來補充了。
      對了,有沒有覺得string中的find_last_of,find_first_of,find_last_not_of,find_first_not_of很礙眼啊,顯然這是一種不用組合思想下設計出來的api產物了。其實,別看stl是官方iso的嫡出親子,但是,內中的很多api的設計都不咋樣,實在不是學習的好對象。你還別不服,想想人家C#linq的鏈式調用,那個用起來,才叫痛快。

posted on 2016-05-09 19:28 華夏之火 閱讀(1413) 評論(2)  編輯 收藏 引用 所屬分類: c++技術探討

評論

# re: stl中string的一種改造 2016-05-10 08:35 呵呵

string再糟糕起碼還有個用的,做編譯器的人會維護升級。你再看看那個C的char*,處理字符串有多痛苦,malloc, free... 要效率沒效率要易用性沒易用性...  回復  更多評論   

# re: stl中string的一種改造 2016-06-01 15:40 呵呵

string再糟糕起碼還有個用的,做編譯器的人會維護升級。你再看看那個C的char*,處理字符串有多痛苦,malloc, free... 要效率沒效率要易用性沒易用性...  回復  更多評論   

導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合色婷婷| 久久精品毛片| 欧美一区二区三区久久精品茉莉花| 亚洲日本无吗高清不卡| 久久九九免费视频| 免费日韩av片| 欧美人成在线视频| 在线播放日韩专区| 久久综合九色九九| 亚洲午夜一区二区| 国产精品免费一区二区三区在线观看| 国产精品乱人伦一区二区| 欧美xx69| 在线高清一区| 亚洲视频二区| 亚洲高清激情| 午夜精品在线| 亚洲精品乱码久久久久久按摩观| 一区二区欧美在线观看| 国产精品三上| 亚洲国产精品第一区二区三区| 久久国产加勒比精品无码| 午夜精彩视频在线观看不卡 | 国产乱理伦片在线观看夜一区| 亚洲无亚洲人成网站77777| 亚洲欧美激情四射在线日 | 在线视频欧美精品| 99精品国产高清一区二区| 国产欧美在线看| 亚洲高清三级视频| 国产精品久久毛片a| 久久久国产一区二区| 欧美日韩国产色站一区二区三区| 久久精品国产一区二区三| 国产精品女人网站| 欧美高清在线一区二区| 精品成人国产在线观看男人呻吟| 亚洲一区二区少妇| 亚洲毛片网站| 亚洲高清精品中出| 亚洲先锋成人| 久久亚洲精品一区二区| 国产日韩欧美精品综合| 国产日韩一区欧美| 亚洲欧美日韩国产综合精品二区| 国内精品免费在线观看| 亚洲欧美日韩中文视频| 亚洲人成绝费网站色www| 欧美日韩亚洲视频| 欧美在线看片a免费观看| 欧美一级黄色网| 一本在线高清不卡dvd| 久久久综合香蕉尹人综合网| 亚洲欧美日韩精品在线| 欧美日韩成人网| 久久人人精品| 亚洲人成网站在线播| 欧美一区二区三区视频免费播放| 伊人久久综合97精品| 久久久久国色av免费观看性色| 免费在线日韩av| 亚洲一级影院| 亚洲国产91精品在线观看| 欧美日韩亚洲成人| 欧美在线免费观看视频| 亚洲午夜精品一区二区| 欧美影院成人| 久久久久久免费| 欧美在线精品免播放器视频| 国产欧美日韩一区二区三区在线观看| 麻豆精品视频在线观看| 亚洲欧美日韩国产成人精品影院| 日韩午夜视频在线观看| 亚洲片区在线| 91久久精品国产| 欧美一区二区三区精品| 亚洲一区视频| 亚洲激情成人在线| 欧美成人午夜激情视频| 久久国产黑丝| 久久成人资源| 欧美大尺度在线| 国产乱码精品一区二区三区不卡| 久久影视精品| 农村妇女精品| 久久久久.com| 午夜精品久久久久久久久| 欧美黄免费看| 99xxxx成人网| 亚洲一区国产视频| 亚洲欧美日本日韩| 久久久综合网| 欧美日韩在线精品| 国产精品裸体一区二区三区| 精品成人免费| 亚洲高清av在线| a91a精品视频在线观看| 久久综合伊人77777| 亚洲国产精品传媒在线观看 | 奶水喷射视频一区| 欧美激情一区二区三区在线| 亚洲高清一二三区| 久久久夜夜夜| 亚洲一区在线播放| 美女露胸一区二区三区| 国产精品一区=区| 亚洲欧美日韩国产另类专区| 久久综合狠狠综合久久综合88| 亚洲韩国青草视频| 日韩视频精品| 欧美国产一区二区在线观看| 欧美区一区二| 亚洲国产欧美久久| 亚洲国产精品尤物yw在线观看 | 午夜精品短视频| 亚洲综合精品四区| 一区二区三区国产在线| 欧美成人精品| 欧美日韩精品一区二区三区四区| 久久久久久久久久久久久久一区| 欧美精品不卡| 亚洲欧美日韩高清| 久久精品国产亚洲a| 激情一区二区三区| 亚洲人体影院| 国产精品日韩在线| 久久香蕉国产线看观看av| 久久精品一区二区三区不卡牛牛| 国产日本欧美在线观看| 欧美全黄视频| 亚洲网站视频| 欧美亚洲尤物久久| 亚洲精品久久久久久久久久久久久| 久久久久五月天| 欧美国产精品日韩| 91久久中文| 久久久国产精品一区二区中文| 国产日韩亚洲欧美综合| 欧美一区二区视频免费观看| 久久精品亚洲乱码伦伦中文 | 亚洲黄色片网站| 亚洲欧洲日产国产网站| 欧美国产日韩视频| 久久aⅴ国产欧美74aaa| 久久影视三级福利片| 一本色道精品久久一区二区三区| 中国成人黄色视屏| 亚洲一区二区综合| 免费不卡欧美自拍视频| 久久久久久电影| 久久人人97超碰人人澡爱香蕉 | 美女免费视频一区| 欧美成人精品在线观看| 国产日产精品一区二区三区四区的观看方式 | 国产日韩亚洲欧美精品| 欧美国产另类| 香蕉久久一区二区不卡无毒影院| 麻豆精品国产91久久久久久| 久久久久一区二区三区| 国产精品嫩草99a| 日韩网站在线| 日韩视频免费在线| 欧美xart系列在线观看| 亚洲日本成人| 激情另类综合| 欧美日韩一区二区三区四区在线观看 | 一区二区三区在线不卡| 中日韩视频在线观看| 亚洲精品一二区| 欧美人交a欧美精品| 日韩小视频在线观看专区| 国产一区二区视频在线观看| 久久躁日日躁aaaaxxxx| 亚洲精品视频在线| 欧美专区在线| 日韩亚洲欧美成人| 国产日韩欧美在线视频观看| 性一交一乱一区二区洋洋av| 新片速递亚洲合集欧美合集| 亚洲国产欧美一区二区三区丁香婷| 亚洲少妇诱惑| 午夜精品久久久久久久久| 国产情人综合久久777777| 欧美日精品一区视频| 欧美日韩在线一二三| 欧美精品91| 欧美激情综合色综合啪啪| 久久久噜噜噜久久人人看| 亚洲视频导航| 亚洲免费久久| 亚洲欧洲免费视频| 99国产精品99久久久久久粉嫩| 欧美va亚洲va香蕉在线| 久久综合九色九九| 久久久久久亚洲精品杨幂换脸| 久久在线视频| 午夜精品久久久久久久久| 久久久久国产精品一区二区| 国产精品区免费视频| 欧美日本在线视频|